Skip to content
Snippets Groups Projects
Select Git revision
  • 37cc6846b832ac47c63e2bd65bfdf0caf8984edc
  • master default protected
  • artefact-eval
  • modelica
  • visibilityscopes
  • scopetree
  • similarCfg
  • wip-reusable
8 results

InterfaceB.java

Blame
  • ScopeAnalysis.java 3.12 KiB
    package org.extendj;
    
    
    import org.extendj.ast.*;
    
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.util.Collection;
    import java.util.List;
    import java.util.Set;
    import java.util.stream.Collectors;
    
    public class ScopeAnalysis extends Frontend {
    
      public ScopeAnalysis() {
        super("Java Scope Anaysis", ExtendJVersion.getVersion());
      }
    
    
      /**
       * Entry point for the Java checker.
       *
       * @param args command-line arguments
       */
      public static void main(String[] args) {
    
        if (args.length != 1) {
          System.out.println("usage: SccChecker <directory with java files>");
          System.exit(-1);
        }
    
        try {
          List<String> files = Files.walk(Paths.get(args[2]))
              .filter(Files::isRegularFile)
              .filter(x -> x.getFileName().toString().endsWith(".java")).map(Path::toString).collect(Collectors.toList());
    
          // measure the time (with parsing) from here
          long startMeasurementTime = System.nanoTime();
    
          Program program = new ScopeAnalysis().readProgram(files);
    
          // measure the time (without parsing) from here
          long startGenerationTime = System.nanoTime();
    
          ScopeTree scopeTree = program.scopeTree();
          long startAnalysisTime = System.nanoTime();
    
          Set<VariableShadowFinding> findings = scopeTree.variableShadowings();
    
          // measure the time until here
          long endTime = System.nanoTime();
    
          System.out.print("java,var,false,"
              + files.size() + ","
              + scopeTree.numScopes() + ","
              + scopeTree.numDeclarations() + ","
              + (scopeTree.numScopes() + scopeTree.numDeclarations()) + ","
              + findings.size() + ",");
    
          long parseTime = startGenerationTime - startMeasurementTime;
          long generationTime = startAnalysisTime - startGenerationTime;
          long analysisTime = endTime - startAnalysisTime;
          long fullTime = endTime - startMeasurementTime;
    
          System.out.print((fullTime / 1000000) + ",");
          System.out.print((parseTime / 1000000) + ",");
          System.out.print((generationTime / 1000000) + ",");
          System.out.print((analysisTime / 1000000) + ",");
          System.out.print(((generationTime + analysisTime) / 1000000) + ",");
    
    
        } catch (IOException e) {
          throw new RuntimeException(e);
        }
      }
    
      private Program readProgram(Collection<String> files) throws IOException {
    
    
        Program program = new Program();
        program.resetStatistics();
        program.initBytecodeReader(Program.defaultBytecodeReader());
        program.initJavaParser(Program.defaultJavaParser());
    
        initOptions();
    
        for (String file : files) {
          program.addSourceFile(file);
        }
    
        TypeDecl object = program.lookupType("java.lang", "Object");
        if (object.isUnknown()) {
          // If we try to continue without java.lang.Object, we'll just get a stack overflow
          // in member lookups because the unknown (Object) type would be treated as circular.
          System.err.println("Error: java.lang.Object is missing."
              + " The Java standard library was not found.");
          throw new RuntimeException("exiting with unhandled error!");
        }
    
        return program;
      }
    }