示例#1
0
 @Override
 public int getAdditionalNameFlags(int standardFlags, IASTName name) {
   if ((standardFlags & PDOMName.IS_REFERENCE) == PDOMName.IS_REFERENCE) {
     IASTNode parent = name.getParent();
     if (parent instanceof ICPPASTQualifiedName) {
       // When taking the address of a method it will be called without suppressing
       // the virtual mechanism
       parent = parent.getParent();
       if (parent instanceof IASTIdExpression) {
         parent = parent.getParent();
         if (parent instanceof IASTUnaryExpression) {
           if (((IASTUnaryExpression) parent).getOperator() == IASTUnaryExpression.op_amper)
             return PDOMName.COULD_BE_POLYMORPHIC_METHOD_CALL;
         }
       }
     } else if (parent instanceof ICPPASTFieldReference) {
       // The name is not qualified
       ICPPASTFieldReference fr = (ICPPASTFieldReference) parent;
       parent = parent.getParent();
       if (parent instanceof IASTFunctionCallExpression) {
         // v->member()
         if (fr.isPointerDereference()) {
           return PDOMName.COULD_BE_POLYMORPHIC_METHOD_CALL;
         }
         // v.member()
         IASTExpression fieldOwner = fr.getFieldOwner();
         if (fieldOwner.getValueCategory().isGLValue()) {
           while (fieldOwner instanceof IASTUnaryExpression
               && ((IASTUnaryExpression) fieldOwner).getOperator()
                   == IASTUnaryExpression.op_bracketedPrimary)
             fieldOwner = ((IASTUnaryExpression) fieldOwner).getOperand();
           if (fieldOwner instanceof IASTIdExpression) {
             IBinding b = ((IASTIdExpression) fieldOwner).getName().resolveBinding();
             if (b instanceof IVariable) {
               IType t = ((IVariable) b).getType();
               if (!(t instanceof ICPPReferenceType)) {
                 return 0;
               }
             }
           }
           return PDOMName.COULD_BE_POLYMORPHIC_METHOD_CALL;
         }
       }
     } else if (parent instanceof IASTIdExpression) {
       // Calling a member from within a member
       if (parent.getParent() instanceof IASTFunctionCallExpression) {
         return PDOMName.COULD_BE_POLYMORPHIC_METHOD_CALL;
       }
     }
   }
   return 0;
 }