| /******************************************************************************* |
| * Copyright (c) 2000, 2005 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.indexing; |
| |
| import org.eclipse.jdt.core.Signature; |
| import org.eclipse.jdt.core.compiler.CharOperation; |
| import org.eclipse.jdt.core.search.SearchDocument; |
| import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; |
| import org.eclipse.jdt.internal.core.search.matching.*; |
| |
| public abstract class AbstractIndexer implements IIndexConstants { |
| |
| SearchDocument document; |
| |
| public AbstractIndexer(SearchDocument document) { |
| this.document = document; |
| } |
| public void addAnnotationTypeDeclaration(int modifiers, char[] packageName, char[] name, char[][] enclosingTypeNames) { |
| addIndexEntry(TYPE_DECL, TypeDeclarationPattern.createIndexKey(modifiers, name, packageName, enclosingTypeNames)); |
| |
| addIndexEntry( |
| SUPER_REF, |
| SuperTypeReferencePattern.createIndexKey( |
| modifiers, packageName, name, enclosingTypeNames, null, ANNOTATION_TYPE_SUFFIX, CharOperation.concatWith(TypeConstants.JAVA_LANG_ANNOTATION_ANNOTATION, '.'), ANNOTATION_TYPE_SUFFIX)); |
| } |
| public void addClassDeclaration( |
| int modifiers, |
| char[] packageName, |
| char[] name, |
| char[][] enclosingTypeNames, |
| char[] superclass, |
| char[][] superinterfaces, |
| char[][] typeParameterSignatures) { |
| addIndexEntry(TYPE_DECL, TypeDeclarationPattern.createIndexKey(modifiers, name, packageName, enclosingTypeNames)); |
| |
| if (superclass != null) { |
| superclass = erasure(superclass); |
| addTypeReference(superclass); |
| } |
| addIndexEntry( |
| SUPER_REF, |
| SuperTypeReferencePattern.createIndexKey( |
| modifiers, packageName, name, enclosingTypeNames, typeParameterSignatures, CLASS_SUFFIX, superclass, CLASS_SUFFIX)); |
| if (superinterfaces != null) { |
| for (int i = 0, max = superinterfaces.length; i < max; i++) { |
| char[] superinterface = erasure(superinterfaces[i]); |
| addTypeReference(superinterface); |
| addIndexEntry( |
| SUPER_REF, |
| SuperTypeReferencePattern.createIndexKey( |
| modifiers, packageName, name, enclosingTypeNames, typeParameterSignatures, CLASS_SUFFIX, superinterface, INTERFACE_SUFFIX)); |
| } |
| } |
| } |
| private char[] erasure(char[] typeName) { |
| int genericStart = CharOperation.indexOf(Signature.C_GENERIC_START, typeName); |
| if (genericStart > -1) |
| typeName = CharOperation.subarray(typeName, 0, genericStart); |
| return typeName; |
| } |
| public void addConstructorDeclaration(char[] typeName, char[][] parameterTypes, char[][] exceptionTypes) { |
| int argCount = parameterTypes == null ? 0 : parameterTypes.length; |
| addIndexEntry(CONSTRUCTOR_DECL, ConstructorPattern.createIndexKey(CharOperation.lastSegment(typeName,'.'), argCount)); |
| |
| for (int i = 0; i < argCount; i++) |
| addTypeReference(parameterTypes[i]); |
| if (exceptionTypes != null) |
| for (int i = 0, max = exceptionTypes.length; i < max; i++) |
| addTypeReference(exceptionTypes[i]); |
| } |
| public void addConstructorReference(char[] typeName, int argCount) { |
| char[] simpleTypeName = CharOperation.lastSegment(typeName,'.'); |
| addTypeReference(simpleTypeName); |
| addIndexEntry(CONSTRUCTOR_REF, ConstructorPattern.createIndexKey(simpleTypeName, argCount)); |
| char[] innermostTypeName = CharOperation.lastSegment(simpleTypeName,'$'); |
| if (innermostTypeName != simpleTypeName) |
| addIndexEntry(CONSTRUCTOR_REF, ConstructorPattern.createIndexKey(innermostTypeName, argCount)); |
| } |
| public void addEnumDeclaration(int modifiers, char[] packageName, char[] name, char[][] enclosingTypeNames, char[][] superinterfaces) { |
| addIndexEntry(TYPE_DECL, TypeDeclarationPattern.createIndexKey(modifiers, name, packageName, enclosingTypeNames)); |
| |
| addIndexEntry( |
| SUPER_REF, |
| SuperTypeReferencePattern.createIndexKey( |
| modifiers, packageName, name, enclosingTypeNames, null, ENUM_SUFFIX, CharOperation.concatWith(TypeConstants.JAVA_LANG_ENUM, '.'), CLASS_SUFFIX)); |
| if (superinterfaces != null) { |
| for (int i = 0, max = superinterfaces.length; i < max; i++) { |
| char[] superinterface = erasure(superinterfaces[i]); |
| addTypeReference(superinterface); |
| addIndexEntry( |
| SUPER_REF, |
| SuperTypeReferencePattern.createIndexKey( |
| modifiers, packageName, name, enclosingTypeNames, null, ENUM_SUFFIX, superinterface, INTERFACE_SUFFIX)); |
| } |
| } |
| } |
| public void addFieldDeclaration(char[] typeName, char[] fieldName) { |
| addIndexEntry(FIELD_DECL, FieldPattern.createIndexKey(fieldName)); |
| addTypeReference(typeName); |
| } |
| public void addFieldReference(char[] fieldName) { |
| addNameReference(fieldName); |
| } |
| protected void addIndexEntry(char[] category, char[] key) { |
| this.document.addIndexEntry(category, key); |
| } |
| public void addInterfaceDeclaration(int modifiers, char[] packageName, char[] name, char[][] enclosingTypeNames, char[][] superinterfaces, char[][] typeParameterSignatures) { |
| addIndexEntry(TYPE_DECL, TypeDeclarationPattern.createIndexKey(modifiers, name, packageName, enclosingTypeNames)); |
| |
| if (superinterfaces != null) { |
| for (int i = 0, max = superinterfaces.length; i < max; i++) { |
| char[] superinterface = erasure(superinterfaces[i]); |
| addTypeReference(superinterface); |
| addIndexEntry( |
| SUPER_REF, |
| SuperTypeReferencePattern.createIndexKey( |
| modifiers, packageName, name, enclosingTypeNames, typeParameterSignatures, INTERFACE_SUFFIX, superinterface, INTERFACE_SUFFIX)); |
| } |
| } |
| } |
| public void addMethodDeclaration(char[] methodName, char[][] parameterTypes, char[] returnType, char[][] exceptionTypes) { |
| int argCount = parameterTypes == null ? 0 : parameterTypes.length; |
| addIndexEntry(METHOD_DECL, MethodPattern.createIndexKey(methodName, argCount)); |
| |
| for (int i = 0; i < argCount; i++) |
| addTypeReference(parameterTypes[i]); |
| if (exceptionTypes != null) |
| for (int i = 0, max = exceptionTypes.length; i < max; i++) |
| addTypeReference(exceptionTypes[i]); |
| if (returnType != null) |
| addTypeReference(returnType); |
| } |
| public void addMethodReference(char[] methodName, int argCount) { |
| addIndexEntry(METHOD_REF, MethodPattern.createIndexKey(methodName, argCount)); |
| } |
| public void addNameReference(char[] name) { |
| addIndexEntry(REF, name); |
| } |
| public void addTypeReference(char[] typeName) { |
| addNameReference(CharOperation.lastSegment(typeName, '.')); |
| } |
| public abstract void indexDocument(); |
| } |