Parent: [e2a310] (diff)

Child: [f9ea78] (diff)

Download this file

Manager.rsc    110 lines (91 with data), 4.0 kB

module Manager

import util::ShellExec;
import List;
import Set;
import IO;
import lang::java::m3::Core;
import lang::java::m3::AST;
import util::Math;
import String;

data M3 = unknownFileType(int lines)
        | m3WithAdditionalInfo(M3 model, Declaration ast, int total, int comments, int empty, int source)
        ;

str checkOutRepository(str repositoryURL, int revision, loc localStorage) {
    str result = readEntireStream(createProcess("svn", 
        ["co", "-r", toString(revision), "--non-interactive", "--trust-server-cert", repositoryURL], localStorage
    ));
    return result;
}

M3 createFileM3(loc file) {
  if (file.extension == "java") {
    M3 fileM3 = createM3FromFile(file);
    loc compilationUnitSrc = getCompilationUnit(fileM3);
  
    str fileContents = readFile(compilationUnitSrc);
  
    int total = compilationUnitSrc.end.line;
    int comment = countCommentedLoc(fileM3, fileContents);
    int empty = countEmptyLoc(fileM3, fileContents);
    int source = total - comment - empty;

    return m3WithAdditionalInfo(fileM3, createAstFromFile(file, true), total, comment, empty, source);
  }
  return unknownFileType(size(readFileLines(file)));
}

bool isValid(M3 fileM3) {
  return !isEmpty(fileM3);
}

loc getCompilationUnit(M3 fileM3) {
  set[loc] compilationUnit = {src | <name, src> <- fileM3@declarations, isCompilationUnit(name)};
  assert size(compilationUnit) == 1 : "More than one compilation unit in a file???";
  loc compilationUnitSrc = getOneFrom(compilationUnit);
  
  return compilationUnitSrc;
}

int countTotalLoc(M3 fileM3) {
  loc compilationUnit = getCompilationUnit(fileM3);
  return compilationUnit.end.line;
}

int countCommentedLoc(M3 fileM3, str fileContents) {
  int result = 0;
  set[loc] comments = { src | <name, src> <- fileM3@documentation, isCompilationUnit(name) };
  for (source <- comments) {
    result += source.end.line - source.begin.line + 1 - checkForSourceLines(source, fileContents);
  }
  return result;
}

int countEmptyLoc(M3 fileM3, str fileContents)
  =  (0 | it + 1 | /^\s*$/ <- split("\n", removeComments(fileContents, fileM3)));
  
tuple[str language, int count] locPerLanguage(M3 fileM3) {
  return <"java", countTotalLoc(fileM3)>;
}

tuple[str language, int count] locPerLanguage(loc file) {
  return <file.extension, size(readFileLines(file))>;
}

int countCommentedLoc(M3 projectModel, loc cu) 
  = (0 | it + (doc.end.line - doc.begin.line + 1 - checkForSourceLines(doc)) | doc <- projectModel@documentation[cu]); 

private int checkForSourceLines(loc commentLoc, str fileContents) {
  str comment = substring(fileContents, commentLoc.offset, commentLoc.offset + commentLoc.length);
  // We will check to see if there are any source code in the commented lines
  loc commentedLines = commentLoc;
  // start from start of the line
  commentedLines.begin.column = 0;
  // increase to the next line to cover the full line
  commentedLines.end.line += 1;
  // we won't take any character from the next line
  commentedLines.end.column = 0;
  list[str] contents = split("\n", fileContents)[commentedLines.begin.line-1..commentedLines.end.line-1];
  str commentedLinesSrc = intercalate("\n", contents);
  // since we look till the start of the next line, we need to make sure we remove the extra \n from the end  
  if (isEmpty(last(contents)))
    commentedLinesSrc = replaceLast(commentedLinesSrc, "\n" , "");
  return size(split(trim(comment), trim(commentedLinesSrc)));
}

str removeComments(str contents, M3 fileM3) {
  set[loc] compilationUnit = {src | <name, src> <- fileM3@declarations, isCompilationUnit(name)};
  assert size(compilationUnit) == 1 : "More than one compilation unit in a file???";
  loc cu = getOneFrom(compilationUnit);
  list[str] listContents = split("\n", contents);
  list[str] result = listContents;
  for (loc commentLoc <- fileM3@documentation[cu]) {
    // remove comments
    result = result - slice(listContents, commentLoc.begin.line - 1, commentLoc.end.line - commentLoc.begin.line + 1);
  }
  return intercalate("\n", result);
}