/*******************************************************************************
* Copyright (c) 2000, 2007 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
*
*******************************************************************************/
package org.eclipse.dltk.internal.core.search.matching;
import org.eclipse.dltk.compiler.CharOperation;
import org.eclipse.dltk.core.IDLTKLanguageToolkit;
import org.eclipse.dltk.core.search.SearchPattern;
import org.eclipse.dltk.core.search.indexing.IIndexConstants;
public class QualifiedTypeDeclarationPattern extends TypeDeclarationPattern
implements IIndexConstants {
public char[] qualification;
private PackageDeclarationPattern packagePattern;
// PackageDeclarationPattern packagePattern;
// public int packageIndex = -1;
public QualifiedTypeDeclarationPattern(char[] qualification,
char[] simpleName, char typeSuffix, int matchRule,
IDLTKLanguageToolkit toolkit) {
this(matchRule, toolkit);
this.qualification = isCaseSensitive() ? qualification : CharOperation
.toLowerCase(qualification);
this.simpleName = (isCaseSensitive() || isCamelCase()) ? simpleName
: CharOperation.toLowerCase(simpleName);
this.typeSuffix = typeSuffix;
}
public QualifiedTypeDeclarationPattern(char[] qualification,
int qualificationMatchRule, char[] simpleName, char typeSuffix,
int matchRule, IDLTKLanguageToolkit toolkit) {
this(qualification, simpleName, typeSuffix, matchRule, toolkit);
this.packagePattern = new PackageDeclarationPattern(qualification,
qualificationMatchRule, toolkit);
}
QualifiedTypeDeclarationPattern(int matchRule, IDLTKLanguageToolkit toolkit) {
super(matchRule, toolkit);
}
public void decodeIndexKey(char[] key) {
super.decodeIndexKey(key);
this.qualification = CharOperation.concatWith(pkg, enclosingTypeNames,
TYPE_SEPARATOR);
}
public SearchPattern getBlankPattern() {
return new QualifiedTypeDeclarationPattern(R_EXACT_MATCH
| R_CASE_SENSITIVE, getToolkit());
}
public boolean matchesDecodedKey(SearchPattern decodedPattern) {
QualifiedTypeDeclarationPattern pattern = (QualifiedTypeDeclarationPattern) decodedPattern;
switch (this.typeSuffix) {
case TYPE_SUFFIX:
switch (pattern.typeSuffix) {
case TYPE_SUFFIX:
break;
default:
return false;
}
break;
case ANNOTATION_TYPE_SUFFIX:
if (this.typeSuffix != pattern.typeSuffix)
return false;
break;
}
boolean matchesName = matchesName(this.simpleName, pattern.simpleName);
if (matchesName) {
if (this.qualification != null) {
if (this.packagePattern != null) {
return this.packagePattern.matchesName(this.qualification,
pattern.qualification);
}
return pattern.matchesName(this.qualification,
pattern.qualification);
}
return true;
}
return false;
}
protected StringBuffer print(StringBuffer output) {
switch (this.typeSuffix) {
case TYPE_SUFFIX:
output.append("ClassDeclarationPattern: 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 (simpleName != null)
output.append(simpleName);
else
output.append("*"); //$NON-NLS-1$
output.append("> "); //$NON-NLS-1$
return super.print(output);
}
}