/*******************************************************************************
* Copyright (c) 2000, 2008 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 QualifiedTypeDeclarationPattern extends TypeDeclarationPattern {
public char[] qualification;
PackageDeclarationPattern packagePattern;
public int packageIndex= -1;
public QualifiedTypeDeclarationPattern(char[] qualification, char[] simpleName, char typeSuffix, int matchRule) {
this(matchRule);
this.qualification= this.isCaseSensitive ? qualification : CharOperation.toLowerCase(qualification);
this.simpleName= (this.isCaseSensitive || this.isCamelCase) ? simpleName : CharOperation.toLowerCase(simpleName);
this.typeSuffix= typeSuffix;
this.mustResolve= this.qualification != null || typeSuffix != TYPE_SUFFIX;
}
public QualifiedTypeDeclarationPattern(char[] qualification, int qualificationMatchRule, char[] simpleName, char typeSuffix, int matchRule) {
this(qualification, simpleName, typeSuffix, matchRule);
this.packagePattern= new PackageDeclarationPattern(qualification, qualificationMatchRule);
}
QualifiedTypeDeclarationPattern(int matchRule) {
super(matchRule);
}
public void decodeIndexKey(char[] key) {
int slash= CharOperation.indexOf(SEPARATOR, key, 0);
this.simpleName= CharOperation.subarray(key, 0, slash);
int start= ++slash;
if (key[start] == SEPARATOR) {
this.pkg= CharOperation.NO_CHAR;
} else {
slash= CharOperation.indexOf(SEPARATOR, key, start);
this.pkg= internedPackageNames.add(CharOperation.subarray(key, start, slash));
}
this.qualification= this.pkg;
// Continue key read by the end to decode modifiers
int last= key.length - 1;
this.secondary= key[last] == 'S';
if (this.secondary) {
last-= 2;
}
this.modifiers= key[last - 1] + (key[last] << 16);
decodeModifiers();
// Retrieve enclosing type names
start= slash + 1;
last-= 2; // position of ending slash
if (start == last) {
this.enclosingTypeNames= CharOperation.NO_CHAR_CHAR;
} else {
int length= this.qualification.length;
int size= last - start;
System.arraycopy(this.qualification, 0, this.qualification= new char[length + 1 + size], 0, length);
this.qualification[length]= '.';
if (last == (start + 1) && key[start] == ZERO_CHAR) {
this.enclosingTypeNames= ONE_ZERO_CHAR;
this.qualification[length + 1]= ZERO_CHAR;
} else {
this.enclosingTypeNames= CharOperation.splitOn('.', key, start, last);
System.arraycopy(key, start, this.qualification, length + 1, size);
}
}
}
public SearchPattern getBlankPattern() {
return new QualifiedTypeDeclarationPattern(R_EXACT_MATCH | R_CASE_SENSITIVE);
}
public boolean matchesDecodedKey(SearchPattern decodedPattern) {
QualifiedTypeDeclarationPattern pattern= (QualifiedTypeDeclarationPattern)decodedPattern;
// check type suffix
if (this.typeSuffix != pattern.typeSuffix && this.typeSuffix != TYPE_SUFFIX) {
if (!matchDifferentTypeSuffixes(this.typeSuffix, pattern.typeSuffix)) {
return false;
}
}
// check name
return matchesName(this.simpleName, pattern.simpleName) &&
(this.qualification == null || this.packagePattern == null || this.packagePattern.matchesName(this.qualification, pattern.qualification));
}
protected StringBuffer print(StringBuffer output) {
switch (this.typeSuffix) {
case CLASS_SUFFIX:
output.append("ClassDeclarationPattern: qualification<"); //$NON-NLS-1$
break;
case CLASS_AND_INTERFACE_SUFFIX:
output.append("ClassAndInterfaceDeclarationPattern: qualification<"); //$NON-NLS-1$
break;
case CLASS_AND_ENUM_SUFFIX:
output.append("ClassAndEnumDeclarationPattern: qualification<"); //$NON-NLS-1$
break;
case INTERFACE_SUFFIX:
output.append("InterfaceDeclarationPattern: qualification<"); //$NON-NLS-1$
break;
case INTERFACE_AND_ANNOTATION_SUFFIX:
output.append("InterfaceAndAnnotationDeclarationPattern: qualification<"); //$NON-NLS-1$
break;
case ENUM_SUFFIX:
output.append("EnumDeclarationPattern: qualification<"); //$NON-NLS-1$
break;
case ANNOTATION_TYPE_SUFFIX:
output.append("AnnotationTypeDeclarationPattern: qualification<"); //$NON-NLS-1$
break;
default:
output.append("TypeDeclarationPattern: qualification<"); //$NON-NLS-1$
break;
}
if (this.qualification != null)
output.append(this.qualification);
else
output.append("*"); //$NON-NLS-1$
output.append(">, type<"); //$NON-NLS-1$
if (this.simpleName != null)
output.append(this.simpleName);
else
output.append("*"); //$NON-NLS-1$
output.append("> "); //$NON-NLS-1$
return super.print(output);
}
}