1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 14:42:11 +02:00

Bug 539535 - Originate an accurate lookup point in CPPASTFieldReference.createEvaluation()

Change-Id: I8030d5b304a61d7235a8ca92cf99de2d9a9aff68
This commit is contained in:
Nathan Ridge 2018-09-28 00:59:08 -04:00
parent fde7476a1a
commit dcc09f1975
2 changed files with 54 additions and 33 deletions

View file

@ -292,43 +292,48 @@ public class CPPASTFieldReference extends ASTNode
}
private ICPPEvaluation createEvaluation() {
ICPPEvaluation ownerEval = fOwner.getEvaluation();
if (!ownerEval.isTypeDependent()) {
IType ownerType= EvalMemberAccess.getFieldOwnerType(ownerEval.getType(), fIsDeref, null, false);
if (ownerType != null) {
IBinding binding = fName.resolvePreBinding();
if (binding instanceof CPPFunctionSet)
binding= fName.resolveBinding();
if (binding instanceof IProblemBinding || binding instanceof IType || binding instanceof ICPPConstructor) {
try {
CPPSemantics.pushLookupPoint(this);
ICPPEvaluation ownerEval = fOwner.getEvaluation();
if (!ownerEval.isTypeDependent()) {
IType ownerType= EvalMemberAccess.getFieldOwnerType(ownerEval.getType(), fIsDeref, null, false);
if (ownerType != null) {
IBinding binding = fName.resolvePreBinding();
if (binding instanceof CPPFunctionSet)
binding= fName.resolveBinding();
if (binding instanceof IProblemBinding || binding instanceof IType || binding instanceof ICPPConstructor) {
return EvalFixed.INCOMPLETE;
}
return new EvalMemberAccess(ownerType, ownerEval.getValueCategory(), binding, ownerEval, fIsDeref, this);
}
}
IBinding qualifier= null;
ICPPTemplateArgument[] args= null;
IASTName n= fName;
if (n instanceof ICPPASTQualifiedName) {
ICPPASTQualifiedName qn= (ICPPASTQualifiedName) n;
ICPPASTNameSpecifier[] ns= qn.getQualifier();
if (ns.length < 1)
return EvalFixed.INCOMPLETE;
qualifier= ns[ns.length - 1].resolveBinding();
if (qualifier instanceof IProblemBinding)
return EvalFixed.INCOMPLETE;
n= qn.getLastName();
}
if (n instanceof ICPPASTTemplateId) {
try {
args= CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) n);
} catch (DOMException e) {
return EvalFixed.INCOMPLETE;
}
return new EvalMemberAccess(ownerType, ownerEval.getValueCategory(), binding, ownerEval, fIsDeref, this);
}
return new EvalID(ownerEval, qualifier, fName.getSimpleID(), false, true, fIsDeref, args, this);
} finally {
CPPSemantics.popLookupPoint();
}
IBinding qualifier= null;
ICPPTemplateArgument[] args= null;
IASTName n= fName;
if (n instanceof ICPPASTQualifiedName) {
ICPPASTQualifiedName qn= (ICPPASTQualifiedName) n;
ICPPASTNameSpecifier[] ns= qn.getQualifier();
if (ns.length < 1)
return EvalFixed.INCOMPLETE;
qualifier= ns[ns.length - 1].resolveBinding();
if (qualifier instanceof IProblemBinding)
return EvalFixed.INCOMPLETE;
n= qn.getLastName();
}
if (n instanceof ICPPASTTemplateId) {
try {
args= CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) n);
} catch (DOMException e) {
return EvalFixed.INCOMPLETE;
}
}
return new EvalID(ownerEval, qualifier, fName.getSimpleID(), false, true, fIsDeref, args, this);
}
public static int getFieldPosition(ICPPField field) {

View file

@ -740,4 +740,20 @@ public class SemanticHighlightingTest extends TestCase {
ignoredHighlightings.add(SemanticHighlightings.OVERLOADED_OPERATOR);
makeAssertions(ignoredHighlightings);
}
// struct S { //$class
// int waldo; //$field
// };
// struct Iter { //$class
// S operator*(); //$class,methodDeclaration
// };
// int main() { //$functionDeclaration
// Iter it; //$class,localVariableDeclaration
// // TODO: The fact that the opening parenthesis gets its own overloadedOperator
// // semantic highlighting is an (unrelated) bug.
// 1 + (*it).waldo; //$overloadedOperator,overloadedOperator,localVariable,field
// }
public void testOverloadedOperatorStar_539535() throws Exception {
makeAssertions();
}
}