| /******************************************************************************* |
| * Copyright (c) 2000, 2010 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.core.search.matching; |
| |
| import org.eclipse.jdt.core.compiler.CharOperation; |
| import org.eclipse.jdt.core.search.SearchPattern; |
| |
| public class PackageReferencePattern extends IntersectingPattern { |
| |
| protected char[] pkgName; |
| |
| protected char[][] segments; |
| protected int currentSegment; |
| |
| protected static char[][] CATEGORIES = { REF }; |
| |
| public PackageReferencePattern(char[] pkgName, int matchRule) { |
| this(matchRule); |
| |
| if (pkgName == null || pkgName.length == 0) { |
| this.pkgName = null; |
| this.segments = new char[][] {CharOperation.NO_CHAR}; |
| this.mustResolve = false; |
| } else { |
| this.pkgName = (this.isCaseSensitive || this.isCamelCase) ? pkgName : CharOperation.toLowerCase(pkgName); |
| this.segments = CharOperation.splitOn('.', this.pkgName); |
| this.mustResolve = true; |
| } |
| } |
| PackageReferencePattern(int matchRule) { |
| super(PKG_REF_PATTERN, matchRule); |
| } |
| public void decodeIndexKey(char[] key) { |
| // Package reference keys are encoded as 'name' (where 'name' is the last segment of the package name) |
| this.pkgName = key; |
| } |
| public SearchPattern getBlankPattern() { |
| return new PackageReferencePattern(R_EXACT_MATCH | R_CASE_SENSITIVE); |
| } |
| public char[] getIndexKey() { |
| // Package reference keys are encoded as 'name' (where 'name' is the last segment of the package name) |
| if (this.currentSegment >= 0) |
| return this.segments[this.currentSegment]; |
| return null; |
| } |
| public char[][] getIndexCategories() { |
| return CATEGORIES; |
| } |
| protected boolean hasNextQuery() { |
| // if package has at least 4 segments, don't look at the first 2 since they are mostly |
| // redundant (e.g. in 'org.eclipse.jdt.core.*' 'org.eclipse' is used all the time) |
| return --this.currentSegment >= (this.segments.length >= 4 ? 2 : 0); |
| } |
| public boolean matchesDecodedKey(SearchPattern decodedPattern) { |
| return true; // index key is not encoded so query results all match |
| } |
| protected void resetQuery() { |
| /* walk the segments from end to start as it will find less potential references using 'lang' than 'java' */ |
| this.currentSegment = this.segments.length - 1; |
| } |
| protected StringBuffer print(StringBuffer output) { |
| output.append("PackageReferencePattern: <"); //$NON-NLS-1$ |
| if (this.pkgName != null) |
| output.append(this.pkgName); |
| else |
| output.append("*"); //$NON-NLS-1$ |
| output.append(">"); //$NON-NLS-1$ |
| return super.print(output); |
| } |
| } |