blob: a7602d048051f4e370cf3dbc2d57e2a9b9034306 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.ui.text;
import org.eclipse.jdt.ui.JavaElementLabels;
import org.eclipse.jdt.internal.ui.util.PatternMatcher;
import org.eclipse.jdt.internal.ui.util.StringMatcher;
/**
* A pattern matcher for labels from {@link JavaElementLabels} where the label starts with the name
* of the element (appended method return type or post qualifications are OK).
*
* If the pattern starts with a valid Java identifier, the name from the label is matched
* with a {@link PatternMatcher} and the rest is matched with a {@link StringMatcher}.
* Otherwise, the whole label is matched with a {@link StringMatcher}.
*
* @since 3.8
*/
public class JavaElementPrefixPatternMatcher {
static final String STAR= "*"; //$NON-NLS-1$
private PatternMatcher fElementNamePattern;
private StringMatcher fRestPattern;
public JavaElementPrefixPatternMatcher(String pattern) {
int elementNameEnd= findNameEnd(pattern);
String elementName= pattern.substring(0, elementNameEnd);
String rest= pattern.substring(elementNameEnd);
if (rest.startsWith(STAR)) {
elementNameEnd= 0;
rest= pattern;
}
fElementNamePattern= elementNameEnd == 0 ? null : new PatternMatcher(elementName);
boolean ignoreCase= rest.toLowerCase().equals(rest);
fRestPattern= new StringMatcher(rest + STAR, ignoreCase, false);
}
private int findNameEnd(String pattern) {
int len= pattern.length();
if (len != 0 && Character.isJavaIdentifierStart(pattern.charAt(0))) {
for (int i= 1; i < len; i++) {
if (! Character.isJavaIdentifierPart(pattern.charAt(i)))
return i;
}
return len;
}
return 0;
}
public boolean matches(String label) {
int elementNameEnd= findNameEnd(label);
if (fElementNamePattern == null)
return fRestPattern.match(label);
if (! fElementNamePattern.matches(label.substring(0, elementNameEnd)))
return false;
return fRestPattern.match(label.substring(elementNameEnd));
}
}