Esempio n. 1
0
  private static URLClassLoader createClassloader(File kotlinHome, CompileContext context) {
    List<File> jars = kompilerClasspath(kotlinHome, context);
    URL[] urls = new URL[jars.size()];
    for (int i = 0; i < urls.length; i++) {
      try {
        urls[i] = jars.get(i).toURI().toURL();
      } catch (MalformedURLException e) {
        throw new RuntimeException(
            e); // Checked exceptions are great! I love them, and I love brilliant library designers
        // too!
      }
    }

    return new URLClassLoader(urls, null);
  }
Esempio n. 2
0
  @Override
  public void compile(
      final CompileContext compileContext,
      Chunk<Module> moduleChunk,
      final VirtualFile[] virtualFiles,
      OutputSink outputSink) {
    if (virtualFiles.length == 0) return;

    List<VirtualFile> productionFiles = new ArrayList<VirtualFile>();
    List<VirtualFile> testFiles = new ArrayList<VirtualFile>();
    for (VirtualFile file : virtualFiles) {
      final boolean inTests = ((CompileContextEx) compileContext).isInTestSourceContent(file);
      if (inTests) {
        testFiles.add(file);
      } else {
        productionFiles.add(file);
      }
    }

    final Module module = compileContext.getModuleByFile(virtualFiles[0]);

    doCompile(compileContext, moduleChunk, productionFiles, module, false);
    doCompile(compileContext, moduleChunk, testFiles, module, true);
  }
Esempio n. 3
0
  private void doCompile(
      CompileContext compileContext,
      Chunk<Module> moduleChunk,
      List<VirtualFile> files,
      Module module,
      boolean tests) {
    if (files.isEmpty()) return;

    VirtualFile mainOutput = compileContext.getModuleOutputDirectory(module);
    final VirtualFile outputDir =
        tests ? compileContext.getModuleOutputDirectoryForTests(module) : mainOutput;
    if (outputDir == null) {
      compileContext.addMessage(ERROR, "[Internal Error] No output directory", "", -1, -1);
      return;
    }

    File kotlinHome = PathUtil.getDefaultCompilerPath();
    if (kotlinHome == null) {
      compileContext.addMessage(
          ERROR, "Cannot find kotlinc home. Make sure plugin is properly installed", "", -1, -1);
      return;
    }

    ModuleChunk chunk =
        new ModuleChunk(
            (CompileContextEx) compileContext,
            moduleChunk,
            Collections.<Module, List<VirtualFile>>emptyMap());
    String moduleName = moduleChunk.getNodes().iterator().next().getName();

    // Filter the output we are writing to
    Set<VirtualFile> outputDirectoriesToFilter =
        Sets.newHashSet(compileContext.getModuleOutputDirectoryForTests(module));
    if (!tests) {
      outputDirectoriesToFilter.add(compileContext.getModuleOutputDirectory(module));
    }
    CharSequence script =
        generateModuleScript(
            moduleName, chunk, files, tests, mainOutput, outputDirectoriesToFilter);

    File scriptFile = new File(path(outputDir), "script.kts");
    try {
      FileUtil.writeToFile(scriptFile, script.toString());
    } catch (IOException e) {
      compileContext.addMessage(
          ERROR,
          "[Internal Error] Cannot write script to " + scriptFile.getAbsolutePath(),
          "",
          -1,
          -1);
      return;
    }

    if (RUN_OUT_OF_PROCESS) {
      runOutOfProcess(compileContext, outputDir, kotlinHome, scriptFile);
    } else {
      runInProcess(compileContext, outputDir, kotlinHome, scriptFile);
    }

    //        compileContext.addMessage(INFORMATION, "Generated module script:\n" +
    // script.toString(), "file://" + path(mainOutput), 0, 1);
  }