@Override
  public int getVisibility() {
    IASTDeclaration decl = getPrimaryDeclaration();
    if (decl == null) {
      IScope scope = getScope();
      if (scope instanceof ICPPClassScope) {
        ICPPClassType cls = ((ICPPClassScope) scope).getClassType();
        if (cls != null)
          return (cls.getKey() == ICPPClassType.k_class)
              ? ICPPASTVisibilityLabel.v_private
              : ICPPASTVisibilityLabel.v_public;
      }
      return ICPPASTVisibilityLabel.v_private;
    }

    IASTCompositeTypeSpecifier cls = (IASTCompositeTypeSpecifier) decl.getParent();
    IASTDeclaration[] members = cls.getMembers();
    ICPPASTVisibilityLabel vis = null;
    for (IASTDeclaration member : members) {
      if (member instanceof ICPPASTVisibilityLabel) {
        vis = (ICPPASTVisibilityLabel) member;
      } else if (member == decl) {
        break;
      }
    }
    if (vis != null) {
      return vis.getVisibility();
    } else if (cls.getKey() == ICPPASTCompositeTypeSpecifier.k_class) {
      return ICPPASTVisibilityLabel.v_private;
    }
    return ICPPASTVisibilityLabel.v_public;
  }
示例#2
0
 private ICPPClassType getNamingClass(ICPPClassType accessOwner) {
   ICPPClassType classType = firstCandidateForNamingClass;
   if (classType != null && isUnqualifiedLookup) {
     IBinding owner = classType.getOwner();
     while (owner instanceof ICPPClassType
         && !derivesFrom(classType, accessOwner, CPPSemantics.MAX_INHERITANCE_DEPTH)) {
       classType = (ICPPClassType) owner;
       owner = classType.getOwner();
     }
   }
   return classType;
 }
示例#3
0
 private static boolean derivesFrom(ICPPClassType derived, ICPPClassType target, int maxdepth) {
   if (derived == target || derived.isSameType(target)) {
     return true;
   }
   if (maxdepth > 0) {
     for (ICPPBase cppBase : derived.getBases()) {
       IBinding base = cppBase.getBaseClass();
       if (base instanceof ICPPClassType) {
         ICPPClassType tbase = (ICPPClassType) base;
         if (tbase.isSameType(target)) {
           return true;
         }
         if (derivesFrom(tbase, target, maxdepth - 1)) return true;
       }
     }
   }
   return false;
 }
示例#4
0
  private boolean isAccessible(
      IBinding binding,
      int bindingVisibility,
      ICPPClassType owner,
      ICPPClassType derivedClass,
      int accessLevel,
      int depth) {
    if (depth > CPPSemantics.MAX_INHERITANCE_DEPTH) return false;

    accessLevel = getMemberAccessLevel(derivedClass, accessLevel);
    if (owner.isSameType(derivedClass)) {
      return isAccessible(bindingVisibility, accessLevel);
    }

    ICPPBase[] bases = derivedClass.getBases();
    if (bases != null) {
      for (ICPPBase base : bases) {
        IBinding baseBinding = base.getBaseClass();
        if (baseBinding instanceof ICPPDeferredClassInstance) {
          // Support content assist for members of deferred instances.
          baseBinding = ((ICPPDeferredClassInstance) baseBinding).getTemplateDefinition();
        }
        if (!(baseBinding instanceof ICPPClassType)) {
          continue;
        }
        if (!isAccessible(base.getVisibility(), accessLevel)) {
          continue;
        }
        if (isAccessible(
            binding,
            bindingVisibility,
            owner,
            (ICPPClassType) baseBinding,
            accessLevel == v_private ? v_protected : accessLevel,
            depth + 1)) {
          return true;
        }
      }
    }
    return false;
  }
示例#5
0
  private boolean isAccessibleBaseClass(ICPPClassType classType, ICPPClassType defived, int depth) {
    if (depth > CPPSemantics.MAX_INHERITANCE_DEPTH) return false;

    if (defived.isSameType(classType)) return true;

    ICPPBase[] bases = defived.getBases();
    if (bases != null) {
      for (ICPPBase base : bases) {
        IBinding baseClass = base.getBaseClass();
        if (!(baseClass instanceof ICPPClassType)) {
          continue;
        }
        if (depth > 0 && !isAccessible(base.getVisibility(), v_protected)) {
          continue;
        }
        if (isAccessibleBaseClass(classType, (ICPPClassType) baseClass, depth + 1)) {
          return true;
        }
      }
    }
    return false;
  }
 private void setFinal(ICPPClassType ct) throws CoreException {
   getDB().putByte(record + FINAL, (byte) (ct.isFinal() ? 1 : 0));
 }