예제 #1
0
  public boolean forFriendship() {
    if (astName == null) return false;
    IASTNode node = astName.getParent();
    while (node instanceof IASTName) node = node.getParent();

    IASTDeclaration decl = null;
    IASTDeclarator dtor = null;
    if (node instanceof ICPPASTDeclSpecifier && node.getParent() instanceof IASTDeclaration) {
      decl = (IASTDeclaration) node.getParent();
    } else if (node instanceof IASTDeclarator) {
      dtor = (IASTDeclarator) node;
      while (dtor.getParent() instanceof IASTDeclarator) dtor = (IASTDeclarator) dtor.getParent();
      if (!(dtor.getParent() instanceof IASTDeclaration)) return false;
      decl = (IASTDeclaration) dtor.getParent();
    } else {
      return false;
    }
    if (decl instanceof IASTSimpleDeclaration) {
      IASTSimpleDeclaration simple = (IASTSimpleDeclaration) decl;
      if (!((ICPPASTDeclSpecifier) simple.getDeclSpecifier()).isFriend()) return false;
      if (dtor != null) return true;
      return simple.getDeclarators().length == 0;
    } else if (decl instanceof IASTFunctionDefinition) {
      IASTFunctionDefinition fnDef = (IASTFunctionDefinition) decl;
      if (!((ICPPASTDeclSpecifier) fnDef.getDeclSpecifier()).isFriend()) return false;
      return (dtor != null);
    }
    return false;
  }
  @Override
  protected void collectModifications(IProgressMonitor pm, ModificationCollector collector)
      throws CoreException, OperationCanceledException {
    List<IASTNode> getterAndSetters = new ArrayList<IASTNode>();
    List<IASTFunctionDefinition> definitions = new ArrayList<IASTFunctionDefinition>();
    for (GetterSetterInsertEditProvider currentProvider : context.selectedFunctions) {
      if (context.isDefinitionSeparate()) {
        getterAndSetters.add(currentProvider.getFunctionDeclaration());
        IASTFunctionDefinition functionDefinition = currentProvider.getFunctionDefinition(true);
        // Standalone definitions in a header file have to be declared inline.
        if (definitionInsertLocation.getTranslationUnit().isHeaderUnit()) {
          functionDefinition.getDeclSpecifier().setInline(true);
        }
        definitions.add(functionDefinition);
      } else {
        getterAndSetters.add(currentProvider.getFunctionDefinition(false));
      }
    }
    if (context.isDefinitionSeparate()) {
      addDefinition(collector, definitions, pm);
    }
    ICPPASTCompositeTypeSpecifier classDefinition =
        (ICPPASTCompositeTypeSpecifier)
            context.existingFields.get(context.existingFields.size() - 1).getParent();

    AddDeclarationNodeToClassChange.createChange(
        classDefinition, VisibilityEnum.v_public, getterAndSetters, false, collector);
  }