Example #1
0
void
CompassAnalyses::FunctionDocumentation::Traversal::
visit(SgNode* sgNode)
{ 
  // Implement your traversal here.  
  if (isSgFunctionDeclaration(sgNode)) 
    {
      SgFunctionDeclaration* funcDecl = isSgFunctionDeclaration(sgNode);
      if (funcDecl->get_file_info()->isCompilerGenerated() 
          || funcDecl->get_definingDeclaration() != sgNode
          )
        return;


      if (!( isDocumented( funcDecl) || 
          isDocumented(isSgFunctionDeclaration(funcDecl->get_firstNondefiningDeclaration()))
           ) 
         ) {
        std::string funcName = funcDecl->get_qualified_name();
        output->addOutput(new CheckerOutput(funcDecl, funcName));
      }

    }




} //End of the visit function.
Example #2
0
int main(int argc,char **argv)
{
  if (argc!=2)
  {
    printf("Usage: %s xml_output_dir\n",argv[0]);
    exit(1);
  }

  int numClasses=0;
  int numDocClasses=0;
  int numStructs=0;
  int numUnions=0;
  int numPredicates=0;
  int numInterfaces=0;
  int numExceptions=0;
  int numNamespaces=0;
  int numFiles=0;
  int numGroups=0;
  int numPages=0;
  int numPackages=0;
  int numPubMethods=0;
  int numProMethods=0;
  int numPriMethods=0;
  int numDocPubMethods=0;
  int numDocProMethods=0;
  int numDocPriMethods=0;
  int numDocPredicates=0;
  int numFunctions=0;
  int numAttributes=0;
  int numVariables=0;
  int numDocFunctions=0;
  int numDocAttributes=0;
  int numDocVariables=0;
  int numParams=0;

  IDoxygen *dox = createObjectModel();

  dox->setDebugLevel(0);

  if (!dox->readXMLDir(argv[1]))
  {
    printf("Error reading %s/index.xml\n",argv[1]);
    exit(1);
  }

  ICompoundIterator *cli = dox->compounds();
  ICompound *comp;
  for (cli->toFirst();(comp=cli->current());cli->toNext())
  {
    printf("Processing %s...\n",comp->name()->latin1());
    bool hasDocs = isDocumented(comp->briefDescription(),comp->detailedDescription());
    switch (comp->kind())
    {
      case ICompound::Class:
        numClasses++;
        if (hasDocs) numDocClasses++;
        break;
      case ICompound::Struct:     numStructs++;    break;
      case ICompound::Union:      numUnions++;     break;
      case ICompound::Interface:  numInterfaces++; break;
      case ICompound::Exception:  numExceptions++; break;
      case ICompound::Namespace:  numNamespaces++; break;
      case ICompound::File:       numFiles++;      break;
      case ICompound::Group:      numGroups++;     break;
      case ICompound::Page:       numPages++;      break;
      case ICompound::Predicate:               if (hasDocs) numDocPredicates++;
      numPredicates++;      break;
      default: break;
    }

    ISectionIterator *sli = comp->sections();
    ISection *sec;
    for (sli->toFirst();(sec=sli->current());sli->toNext())
    {
      IMemberIterator *mli = sec->members();
      IMember *mem;
      for (mli->toFirst();(mem=mli->current());mli->toNext())
      {
        IParamIterator *pli = mem->parameters();
        IParam *par;
        if (comp->kind()==ICompound::Class ||
            comp->kind()==ICompound::Struct ||
            comp->kind()==ICompound::Interface
           )
        {
          if (mem->kind()==IMember::Function ||
              mem->kind()==IMember::Prototype ||
              mem->kind()==IMember::Signal ||
              mem->kind()==IMember::Slot ||
              mem->kind()==IMember::DCOP
             ) // is a "method"
          {
            if (mem->section()->isPublic())
            {
              numPubMethods++;
              if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
              {
                numDocPubMethods++;
              }
            }
            else if (mem->section()->isProtected())
            {
              numProMethods++;
              if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
              {
                numDocProMethods++;
              }
            }
            else if (mem->section()->isPrivate())
            {
              numPriMethods++;
              if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
              {
                numDocPriMethods++;
              }
            }
          }
          else if (mem->kind()==IMember::Variable ||
                   mem->kind()==IMember::Property
                  ) // is an "attribute"
          {
            numAttributes++;
            if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
            {
              numDocAttributes++;
            }
          }
        }
        else if (comp->kind()==ICompound::File ||
                 comp->kind()==ICompound::Namespace
                )
        {
          if (mem->kind()==IMember::Function ||
              mem->kind()==IMember::Prototype ||
              mem->kind()==IMember::Signal ||
              mem->kind()==IMember::Slot ||
              mem->kind()==IMember::DCOP
             ) // is a "method"
          {
            numFunctions++;
            if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
            {
              numDocFunctions++;
            }
          }
          else if (mem->kind()==IMember::Variable ||
                   mem->kind()==IMember::Property
                  ) // is an "attribute"
          {
            numVariables++;
            if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
            {
              numDocVariables++;
            }
          }
        }

        for (pli->toFirst();(par=pli->current());pli->toNext())
        {
          numParams++;
        }
        const char *type = mem->typeString()->latin1();
        if (type && strcmp(type, "void"))
        {
          numParams++; // count non-void return types as well
        }
        pli->release();
      }
      mli->release();
    }
    sli->release();

    comp->release();
  }
  cli->release();

  dox->release();

  int numMethods    = numPubMethods+numProMethods+numPriMethods;
  int numDocMethods = numDocPubMethods+numDocProMethods+numDocPriMethods;

  printf("Metrics:\n");
  printf("-----------------------------------\n");
  if (numPredicates>0)    printf("Predicates:     %10d (%d documented)\n",numPredicates,numDocClasses);
  if (numClasses>0)    printf("Classes:     %10d (%d documented)\n",numClasses,numDocPredicates);
  if (numStructs>0)    printf("Structs:     %10d\n",numStructs);
  if (numUnions>0)     printf("Unions:      %10d\n",numUnions);
  if (numInterfaces>0) printf("Interfaces:  %10d\n",numInterfaces);
  if (numExceptions>0) printf("Exceptions:  %10d\n",numExceptions);
  if (numNamespaces>0) printf("Namespaces:  %10d\n",numNamespaces);
  if (numFiles>0)      printf("Files:       %10d\n",numFiles);
  if (numGroups>0)     printf("Groups:      %10d\n",numGroups);
  if (numPages>0)      printf("Pages:       %10d\n",numPages);
  if (numPackages>0)   printf("Packages:    %10d\n",numPackages);
  if (numMethods>0)    printf("Methods:     %10d (%d documented)\n",numMethods,numDocMethods);
  if (numPubMethods>0) printf("  Public:    %10d (%d documented)\n",numPubMethods,numDocPubMethods);
  if (numProMethods>0) printf("  Protected: %10d (%d documented)\n",numProMethods,numDocProMethods);
  if (numPriMethods>0) printf("  Private:   %10d (%d documented)\n",numPriMethods,numDocPriMethods);
  if (numFunctions>0)  printf("Functions:   %10d (%d documented)\n",numFunctions,numDocFunctions);
  if (numAttributes>0) printf("Attributes:  %10d (%d documented)\n",numAttributes,numDocAttributes);
  if (numVariables>0)  printf("Variables:   %10d (%d documented)\n",numVariables,numDocVariables);
  if (numParams>0)     printf("Params:      %10d\n",numParams);
  printf("-----------------------------------\n");
  if (numClasses>0)    printf("Avg. #methods/compound:  %10f\n",(double)numMethods/(double)numClasses);
  if (numMethods>0)    printf("Avg. #params/method:     %10f\n",(double)numParams/(double)numMethods);
  printf("-----------------------------------\n");

  return 0;
}