in java/java.completion/src/org/netbeans/modules/java/completion/JavaCompletionTask.java [3046:3301]
private void insideExpression(Env env, TreePath exPath) throws IOException {
int offset = env.getOffset();
String prefix = env.getPrefix();
Tree et = exPath.getLeaf();
Tree parent = exPath.getParentPath().getLeaf();
final CompilationController controller = env.getController();
int endPos = (int) env.getSourcePositions().getEndPosition(env.getRoot(), et);
if (endPos != Diagnostic.NOPOS && endPos < offset) {
TokenSequence<JavaTokenId> last = findLastNonWhitespaceToken(env, endPos, offset);
if (last != null && last.token().id() != JavaTokenId.COMMA) {
return;
}
}
controller.toPhase(Phase.RESOLVED);
ElementKind varKind = ElementKind.LOCAL_VARIABLE;
Set<Modifier> varMods = EnumSet.noneOf(Modifier.class);
if (parent.getKind() == Tree.Kind.VARIABLE) {
varMods = ((VariableTree) parent).getModifiers().getFlags();
Element varEl = controller.getTrees().getElement(exPath.getParentPath());
if (varEl != null) {
varKind = varEl.getKind();
}
}
if (et.getKind() == Tree.Kind.ANNOTATED_TYPE) {
et = ((AnnotatedTypeTree) et).getUnderlyingType();
exPath = new TreePath(exPath, et);
}
if (et.getKind() == Tree.Kind.INSTANCE_OF && endPos < offset && controller.getSourceVersion().compareTo(RELEASE_16) >= 0) {
if (((InstanceOfTree) et).getPattern() == null) {
TypeMirror tm = controller.getTrees().getTypeMirror(new TreePath(exPath, ((InstanceOfTree) et).getType()));
final Map<Name, ? extends Element> illegalForwardRefs = env.getForwardReferences();
Scope scope = env.getScope();
final ExecutableElement method = scope.getEnclosingMethod();
ElementUtilities.ElementAcceptor acceptor = new ElementUtilities.ElementAcceptor() {
@Override
public boolean accept(Element e, TypeMirror t) {
return (method == null || method == e.getEnclosingElement() || e.getModifiers().contains(FINAL)
|| EnumSet.of(LOCAL_VARIABLE, PARAMETER, EXCEPTION_PARAMETER, RESOURCE_VARIABLE).contains(simplifyElementKind(e.getKind())) && controller.getSourceVersion().compareTo(SourceVersion.RELEASE_8) >= 0 && controller.getElementUtilities().isEffectivelyFinal((VariableElement)e))
&& !illegalForwardRefs.containsKey(e.getSimpleName());
}
};
for (String name : Utilities.varNamesSuggestions(tm, varKind, varMods, null, prefix, controller.getTypes(), controller.getElements(), controller.getElementUtilities().getLocalMembersAndVars(scope, acceptor), CodeStyle.getDefault(controller.getDocument()))) {
results.add(itemFactory.createVariableItem(env.getController(), name, anchorOffset, true, false));
}
}
return;
}
if (parent.getKind() != Tree.Kind.PARENTHESIZED
&& (et.getKind() == Tree.Kind.PRIMITIVE_TYPE || et.getKind() == Tree.Kind.ARRAY_TYPE || et.getKind() == Tree.Kind.PARAMETERIZED_TYPE)) {
TypeMirror tm = controller.getTrees().getTypeMirror(exPath);
final Map<Name, ? extends Element> illegalForwardRefs = env.getForwardReferences();
Scope scope = env.getScope();
final ExecutableElement method = scope.getEnclosingMethod();
ElementUtilities.ElementAcceptor acceptor = new ElementUtilities.ElementAcceptor() {
@Override
public boolean accept(Element e, TypeMirror t) {
return (method == null || method == e.getEnclosingElement() || e.getModifiers().contains(FINAL)
|| EnumSet.of(LOCAL_VARIABLE, PARAMETER, EXCEPTION_PARAMETER, RESOURCE_VARIABLE).contains(simplifyElementKind(e.getKind())) && controller.getSourceVersion().compareTo(SourceVersion.RELEASE_8) >= 0 && controller.getElementUtilities().isEffectivelyFinal((VariableElement)e))
&& !illegalForwardRefs.containsKey(e.getSimpleName());
}
};
for (String name : Utilities.varNamesSuggestions(tm, varKind, varMods, null, prefix, controller.getTypes(), controller.getElements(), controller.getElementUtilities().getLocalMembersAndVars(scope, acceptor), CodeStyle.getDefault(controller.getDocument()))) {
results.add(itemFactory.createVariableItem(env.getController(), name, anchorOffset, true, false));
}
return;
}
if (et.getKind() == Tree.Kind.UNION_TYPE) {
for (Tree t : ((UnionTypeTree) et).getTypeAlternatives()) {
et = t;
exPath = new TreePath(exPath, t);
}
}
if (et.getKind() == Tree.Kind.IDENTIFIER) {
Element e = controller.getTrees().getElement(exPath);
if (e == null) {
return;
}
TypeMirror tm = controller.getTrees().getTypeMirror(exPath);
switch (simplifyElementKind(e.getKind())) {
case ANNOTATION_TYPE:
case CLASS:
case ENUM:
case INTERFACE:
case PACKAGE:
if (parent.getKind() != Tree.Kind.PARENTHESIZED
|| env.getController().getSourceVersion().compareTo(SourceVersion.RELEASE_8) >= 0) {
final Map<Name, ? extends Element> illegalForwardRefs = env.getForwardReferences();
Scope scope = env.getScope();
final ExecutableElement method = scope.getEnclosingMethod();
ElementUtilities.ElementAcceptor acceptor = new ElementUtilities.ElementAcceptor() {
@Override
public boolean accept(Element e, TypeMirror t) {
return (method == null || method == e.getEnclosingElement() || e.getModifiers().contains(FINAL)
|| EnumSet.of(LOCAL_VARIABLE, PARAMETER, EXCEPTION_PARAMETER, RESOURCE_VARIABLE).contains(simplifyElementKind(e.getKind())) && controller.getSourceVersion().compareTo(SourceVersion.RELEASE_8) >= 0 && controller.getElementUtilities().isEffectivelyFinal((VariableElement)e))
&& !illegalForwardRefs.containsKey(e.getSimpleName());
}
};
for (String name : Utilities.varNamesSuggestions(tm, varKind, varMods, null, prefix, controller.getTypes(), controller.getElements(),
controller.getElementUtilities().getLocalMembersAndVars(scope, acceptor), CodeStyle.getDefault(controller.getDocument()))) {
results.add(itemFactory.createVariableItem(env.getController(), name, anchorOffset, true, false));
}
}
VariableElement ve = getFieldOrVar(env, e.getSimpleName().toString());
if (ve != null) {
addKeyword(env, INSTANCEOF_KEYWORD, SPACE, false);
}
break;
case ENUM_CONSTANT:
case EXCEPTION_PARAMETER:
case FIELD:
case LOCAL_VARIABLE:
case RESOURCE_VARIABLE:
case PARAMETER:
if (tm != null && (tm.getKind() == TypeKind.DECLARED || tm.getKind() == TypeKind.ARRAY || tm.getKind() == TypeKind.ERROR)) {
addKeyword(env, INSTANCEOF_KEYWORD, SPACE, false);
}
TypeElement te = getTypeElement(env, e.getSimpleName().toString());
if (te != null) {
final Map<Name, ? extends Element> illegalForwardRefs = env.getForwardReferences();
Scope scope = env.getScope();
final ExecutableElement method = scope.getEnclosingMethod();
ElementUtilities.ElementAcceptor acceptor = new ElementUtilities.ElementAcceptor() {
@Override
public boolean accept(Element e, TypeMirror t) {
return (method == null || method == e.getEnclosingElement() || e.getModifiers().contains(FINAL)
|| EnumSet.of(LOCAL_VARIABLE, PARAMETER, EXCEPTION_PARAMETER, RESOURCE_VARIABLE).contains(simplifyElementKind(e.getKind())) && controller.getSourceVersion().compareTo(SourceVersion.RELEASE_8) >= 0 && controller.getElementUtilities().isEffectivelyFinal((VariableElement)e))
&& !illegalForwardRefs.containsKey(e.getSimpleName());
}
};
for (String name : Utilities.varNamesSuggestions(controller.getTypes().getDeclaredType(te), varKind, varMods, null, prefix, controller.getTypes(),
controller.getElements(), controller.getElementUtilities().getLocalMembersAndVars(scope, acceptor), CodeStyle.getDefault(controller.getDocument()))) {
results.add(itemFactory.createVariableItem(env.getController(), name, anchorOffset, true, false));
}
}
break;
}
return;
}
Tree exp = null;
if (et.getKind() == Tree.Kind.PARENTHESIZED) {
exp = ((ParenthesizedTree) et).getExpression();
} else if (et.getKind() == Tree.Kind.TYPE_CAST) {
if (env.getSourcePositions().getEndPosition(env.getRoot(), ((TypeCastTree) et).getType()) <= offset) {
exp = ((TypeCastTree) et).getType();
}
} else if (et.getKind() == Tree.Kind.ASSIGNMENT) {
Tree t = ((AssignmentTree) et).getExpression();
if (t.getKind() == Tree.Kind.PARENTHESIZED && env.getSourcePositions().getEndPosition(env.getRoot(), t) < offset) {
exp = ((ParenthesizedTree) t).getExpression();
}
}
if (exp != null) {
exPath = new TreePath(exPath, exp);
if (exp.getKind() == Tree.Kind.PRIMITIVE_TYPE || exp.getKind() == Tree.Kind.ARRAY_TYPE || exp.getKind() == Tree.Kind.PARAMETERIZED_TYPE) {
localResult(env);
addValueKeywords(env);
return;
}
Element e = controller.getTrees().getElement(exPath);
if (e == null) {
if (exp.getKind() == Tree.Kind.TYPE_CAST) {
addKeyword(env, INSTANCEOF_KEYWORD, SPACE, false);
}
return;
}
TypeMirror tm = controller.getTrees().getTypeMirror(exPath);
switch (simplifyElementKind(e.getKind())) {
case ANNOTATION_TYPE:
case CLASS:
case ENUM:
case INTERFACE:
case PACKAGE:
if (exp.getKind() == Tree.Kind.IDENTIFIER) {
VariableElement ve = getFieldOrVar(env, e.getSimpleName().toString());
if (ve != null) {
addKeyword(env, INSTANCEOF_KEYWORD, SPACE, false);
}
if (ve == null || tm == null || tm.getKind() != TypeKind.ERROR) {
localResult(env);
addValueKeywords(env);
}
} else if (exp.getKind() == Tree.Kind.MEMBER_SELECT) {
if (tm != null && (tm.getKind() == TypeKind.ERROR || tm.getKind() == TypeKind.PACKAGE)) {
addKeyword(env, INSTANCEOF_KEYWORD, SPACE, false);
}
localResult(env);
addValueKeywords(env);
} else if (exp.getKind() == Tree.Kind.PARENTHESIZED && tm != null && (tm.getKind() == TypeKind.DECLARED || tm.getKind() == TypeKind.ARRAY)) {
addKeyword(env, INSTANCEOF_KEYWORD, SPACE, false);
}
break;
case ENUM_CONSTANT:
case EXCEPTION_PARAMETER:
case FIELD:
case LOCAL_VARIABLE:
case RESOURCE_VARIABLE:
case PARAMETER:
if (tm != null && (tm.getKind() == TypeKind.DECLARED || tm.getKind() == TypeKind.ARRAY || tm.getKind() == TypeKind.ERROR)) {
addKeyword(env, INSTANCEOF_KEYWORD, SPACE, false);
}
TypeElement te = getTypeElement(env, e.getSimpleName().toString());
if (te != null || exp.getKind() == Tree.Kind.MEMBER_SELECT) {
localResult(env);
addValueKeywords(env);
}
break;
case CONSTRUCTOR:
case METHOD:
if (tm != null && (tm.getKind() == TypeKind.DECLARED || tm.getKind() == TypeKind.ARRAY || tm.getKind() == TypeKind.ERROR)) {
addKeyword(env, INSTANCEOF_KEYWORD, SPACE, false);
}
}
return;
}
Element e = controller.getTrees().getElement(exPath);
TypeMirror tm = controller.getTrees().getTypeMirror(exPath);
if (e == null) {
if (tm != null && (tm.getKind() == TypeKind.DECLARED || tm.getKind() == TypeKind.ARRAY)) {
addKeyword(env, INSTANCEOF_KEYWORD, SPACE, false);
}
return;
}
switch (simplifyElementKind(e.getKind())) {
case ANNOTATION_TYPE:
case CLASS:
case ENUM:
case INTERFACE:
case PACKAGE:
final Map<Name, ? extends Element> illegalForwardRefs = env.getForwardReferences();
Scope scope = env.getScope();
final ExecutableElement method = scope.getEnclosingMethod();
ElementUtilities.ElementAcceptor acceptor = new ElementUtilities.ElementAcceptor() {
@Override
public boolean accept(Element e, TypeMirror t) {
return (method == null || method == e.getEnclosingElement() || e.getModifiers().contains(FINAL)
|| EnumSet.of(LOCAL_VARIABLE, PARAMETER, EXCEPTION_PARAMETER, RESOURCE_VARIABLE).contains(simplifyElementKind(e.getKind())) && controller.getSourceVersion().compareTo(SourceVersion.RELEASE_8) >= 0 && controller.getElementUtilities().isEffectivelyFinal((VariableElement)e))
&& !illegalForwardRefs.containsKey(e.getSimpleName());
}
};
for (String name : Utilities.varNamesSuggestions(tm, varKind, varMods, null, prefix, controller.getTypes(), controller.getElements(), controller.getElementUtilities().getLocalMembersAndVars(scope, acceptor), CodeStyle.getDefault(controller.getDocument()))) {
results.add(itemFactory.createVariableItem(env.getController(), name, anchorOffset, true, false));
}
break;
case ENUM_CONSTANT:
case EXCEPTION_PARAMETER:
case FIELD:
case LOCAL_VARIABLE:
case RESOURCE_VARIABLE:
case PARAMETER:
case CONSTRUCTOR:
case METHOD:
if (tm != null && (tm.getKind() == TypeKind.DECLARED || tm.getKind() == TypeKind.ARRAY || tm.getKind() == TypeKind.ERROR)) {
addKeyword(env, INSTANCEOF_KEYWORD, SPACE, false);
}
}
}