in java/java.completion/src/org/netbeans/modules/java/completion/JavaCompletionTask.java [4083:4262]
private void addMembers(final Env env, final TypeMirror type, final Element elem, final EnumSet<ElementKind> kinds, final DeclaredType baseType, final boolean inImport, final boolean insideNew, final boolean autoImport, final boolean afterConstructorTypeParams, AddSwitchRelatedItem addSwitchItem) throws IOException {
Set<? extends TypeMirror> smartTypes = getSmartTypes(env);
final TreePath path = env.getPath();
TypeMirror actualType = type;
if (path != null && path.getLeaf().getKind() == Tree.Kind.MEMBER_SELECT) {
actualType = adjustType(env, type, elem, new TreePath(path, ((MemberSelectTree)path.getLeaf()).getExpression()));
}
final CompilationController controller = env.getController();
final Trees trees = controller.getTrees();
final Elements elements = controller.getElements();
final ElementUtilities eu = controller.getElementUtilities();
final Types types = controller.getTypes();
final TreeUtilities tu = controller.getTreeUtilities();
TypeElement typeElem = actualType.getKind() == TypeKind.DECLARED ? (TypeElement) ((DeclaredType) actualType).asElement() : null;
final boolean isStatic = elem != null && (elem.getKind().isClass() || elem.getKind().isInterface() || elem.getKind() == TYPE_PARAMETER) && elem.asType().getKind() != TypeKind.ERROR;
final boolean isThisCall = elem != null && elem.getKind().isField() && elem.getSimpleName().contentEquals(THIS_KEYWORD);
final boolean isSuperCall = elem != null && elem.getKind().isField() && elem.getSimpleName().contentEquals(SUPER_KEYWORD);
final Scope scope = env.getScope();
if ((isThisCall || isSuperCall) && tu.isStaticContext(scope)) {
return;
}
final boolean[] ctorSeen = {false};
final boolean[] nestedClassSeen = {false};
final TypeElement enclClass = scope.getEnclosingClass();
ElementUtilities.ElementAcceptor acceptor = new ElementUtilities.ElementAcceptor() {
@Override
public boolean accept(Element e, TypeMirror t) {
switch (simplifyElementKind(e.getKind())) {
case FIELD:
if (!startsWith(env, e.getSimpleName().toString())) {
return false;
}
if (e.getSimpleName().contentEquals(THIS_KEYWORD) || e.getSimpleName().contentEquals(SUPER_KEYWORD)) {
TypeElement cls = enclClass;
while (cls != null) {
if (cls == elem) {
return isOfKindAndType(asMemberOf(e, t, types), e, kinds, baseType, scope, trees, types);
}
TypeElement outer = eu.enclosingTypeElement(cls);
cls = !cls.getModifiers().contains(STATIC) ? outer : null;
}
return false;
}
if (isStatic) {
if (!e.getModifiers().contains(STATIC)
|| e.getSimpleName().contentEquals(CLASS_KEYWORD) && elem.getKind() == ElementKind.TYPE_PARAMETER) {
return false;
}
} else {
if (!options.contains(Options.ALL_COMPLETION) && e.getModifiers().contains(STATIC)) {
if ((Utilities.isShowDeprecatedMembers() || !elements.isDeprecated(e))
&& isOfKindAndType(asMemberOf(e, t, types), e, kinds, baseType, scope, trees, types)
&& env.isAccessible(scope, e, t, isSuperCall)
&& ((isStatic && !inImport) || !e.getSimpleName().contentEquals(CLASS_KEYWORD))) {
hasAdditionalMembers = true;
}
return false;
}
}
return (Utilities.isShowDeprecatedMembers() || !elements.isDeprecated(e))
&& isOfKindAndType(asMemberOf(e, t, types), e, kinds, baseType, scope, trees, types)
&& env.isAccessible(scope, e, t, isSuperCall)
&& ((isStatic && !inImport) || !e.getSimpleName().contentEquals(CLASS_KEYWORD));
case ENUM_CONSTANT:
case EXCEPTION_PARAMETER:
case LOCAL_VARIABLE:
case RESOURCE_VARIABLE:
case PARAMETER:
return startsWith(env, e.getSimpleName().toString())
&& (Utilities.isShowDeprecatedMembers() || !elements.isDeprecated(e))
&& isOfKindAndType(asMemberOf(e, t, types), e, kinds, baseType, scope, trees, types)
&& env.isAccessible(scope, e, t, isSuperCall);
case METHOD:
String sn = e.getSimpleName().toString();
if (isStatic) {
if (!e.getModifiers().contains(STATIC)) {
return false;
}
} else {
if (!options.contains(Options.ALL_COMPLETION) && e.getModifiers().contains(STATIC)) {
if (startsWith(env, sn)
&& (Utilities.isShowDeprecatedMembers() || !elements.isDeprecated(e))
&& isOfKindAndType(((ExecutableType) asMemberOf(e, t, types)).getReturnType(), e, kinds, baseType, scope, trees, types)
&& env.isAccessible(scope, e, t, isSuperCall)
&& (!Utilities.isExcludeMethods() || !Utilities.isExcluded(eu.getElementName(e.getEnclosingElement(), true) + "." + sn))) { //NOI18N
hasAdditionalMembers = true;
}
return false;
}
}
return startsWith(env, sn)
&& (Utilities.isShowDeprecatedMembers() || !elements.isDeprecated(e))
&& isOfKindAndType(((ExecutableType) asMemberOf(e, t, types)).getReturnType(), e, kinds, baseType, scope, trees, types)
&& env.isAccessible(scope, e, t, isSuperCall)
&& (!Utilities.isExcludeMethods() || !Utilities.isExcluded(eu.getElementName(e.getEnclosingElement(), true) + "." + sn)); //NOI18N
case CLASS:
case ENUM:
case INTERFACE:
case ANNOTATION_TYPE:
if (!e.getModifiers().contains(STATIC)) {
nestedClassSeen[0] = true;
}
return startsWith(env, e.getSimpleName().toString())
&& (Utilities.isShowDeprecatedMembers() || !elements.isDeprecated(e))
&& !Utilities.isExcluded(((TypeElement)e).getQualifiedName())
&& isOfKindAndType(e.asType(), e, kinds, baseType, scope, trees, types)
&& (!env.isAfterExtends() || containsAccessibleNonFinalType(e, scope, trees))
&& env.isAccessible(scope, e, t, isSuperCall) && isStatic;
case CONSTRUCTOR:
ctorSeen[0] = true;
return (Utilities.isShowDeprecatedMembers() || !elements.isDeprecated(e))
&& isOfKindAndType(e.getEnclosingElement().asType(), e, kinds, baseType, scope, trees, types)
&& (env.isAccessible(scope, e, t, isSuperCall || insideNew) || (elem.getModifiers().contains(ABSTRACT) && !e.getModifiers().contains(PRIVATE)))
&& isStatic;
}
return false;
}
};
boolean addCast = actualType != type && elem instanceof VariableElement && !elem.getKind().isField();
for (Element e : controller.getElementUtilities().getMembers(actualType, acceptor)) {
switch (simplifyElementKind(e.getKind())) {
case ENUM_CONSTANT:
case EXCEPTION_PARAMETER:
case FIELD:
case LOCAL_VARIABLE:
case RESOURCE_VARIABLE:
case PARAMETER:
String name = e.getSimpleName().toString();
if (THIS_KEYWORD.equals(name) || CLASS_KEYWORD.equals(name) || SUPER_KEYWORD.equals(name)) {
if (!env.isExcludedKW(name)) {
results.add(itemFactory.createKeywordItem(name, null, anchorOffset, isOfSmartType(env, e.asType(), smartTypes)));
env.addExcludedKW(name);
}
} else {
TypeMirror tm = asMemberOf(e, actualType, types);
if (addCast && itemFactory instanceof TypeCastableItemFactory) {
results.add(((TypeCastableItemFactory<T>)itemFactory).createTypeCastableVariableItem(env.getController(), (VariableElement) e, tm, actualType, anchorOffset, autoImport ? env.getReferencesCount() : null, typeElem != e.getEnclosingElement(), elements.isDeprecated(e), isOfSmartType(env, tm, smartTypes), env.assignToVarPos()));
} else {
addSwitchItem.addVariableItem(env.getController(), (VariableElement) e, tm, anchorOffset, autoImport ? env.getReferencesCount() : null, typeElem != e.getEnclosingElement(), elements.isDeprecated(e), isOfSmartType(env, tm, smartTypes), env.assignToVarPos());
}
}
break;
case CONSTRUCTOR:
ExecutableType et = (ExecutableType) asMemberOf(e, actualType, types);
results.add(itemFactory.createExecutableItem(env.getController(), (ExecutableElement) e, et, anchorOffset, autoImport ? env.getReferencesCount() : null, typeElem != e.getEnclosingElement(), elements.isDeprecated(e), inImport, false, afterConstructorTypeParams, isOfSmartType(env, actualType, smartTypes), env.assignToVarPos(), false));
break;
case METHOD:
et = (ExecutableType) asMemberOf(e, actualType, types);
if (addCast && itemFactory instanceof TypeCastableItemFactory
&& !types.isSubtype(type, e.getEnclosingElement().asType())
&& type.getKind() == TypeKind.DECLARED && !hasBaseMethod(elements, (DeclaredType) type, (ExecutableElement) e)) {
results.add(((TypeCastableItemFactory<T>)itemFactory).createTypeCastableExecutableItem(env.getController(), (ExecutableElement) e, et, actualType, anchorOffset, autoImport ? env.getReferencesCount() : null, typeElem != e.getEnclosingElement(), elements.isDeprecated(e), inImport, env.addSemicolon(), isOfSmartType(env, getCorrectedReturnType(env, et, (ExecutableElement) e, actualType), smartTypes), env.assignToVarPos(), false));
} else {
results.add(itemFactory.createExecutableItem(env.getController(), (ExecutableElement) e, et, anchorOffset, autoImport ? env.getReferencesCount() : null, typeElem != e.getEnclosingElement(), elements.isDeprecated(e), inImport, env.addSemicolon(), isOfSmartType(env, getCorrectedReturnType(env, et, (ExecutableElement) e, actualType), smartTypes), env.assignToVarPos(), false));
}
break;
case CLASS:
case ENUM:
case INTERFACE:
case ANNOTATION_TYPE:
DeclaredType dt = (DeclaredType) asMemberOf(e, actualType, types);
addSwitchItem.addTypeItem(env.getController(), (TypeElement) e, dt, anchorOffset, null, elements.isDeprecated(e), insideNew, insideNew || env.isInsideClass(), true, isOfSmartType(env, dt, smartTypes), autoImport);
break;
}
}
if (!ctorSeen[0] && kinds.contains(CONSTRUCTOR) && elem.getKind().isInterface()) {
results.add(itemFactory.createDefaultConstructorItem((TypeElement) elem, anchorOffset, isOfSmartType(env, actualType, smartTypes)));
}
if (isStatic && enclClass != null && elem.getKind().isInterface() && env.getController().getSourceVersion().compareTo(SourceVersion.RELEASE_8) >= 0) {
for (TypeMirror iface : enclClass.getInterfaces()) {
if (((DeclaredType) iface).asElement() == elem) {
results.add(itemFactory.createKeywordItem(SUPER_KEYWORD, null, anchorOffset, isOfSmartType(env, actualType, smartTypes)));
break;
}
}
}
if (!isStatic && nestedClassSeen[0]) {
addKeyword(env, NEW_KEYWORD, SPACE, false);
}
}