def doBuildModule()

in src/org/jetbrains/jps/builders/StandardBuilders.groovy [28:128]


  def doBuildModule(ModuleChunk module, ModuleBuildState state, ProjectBuilder projectBuilder) {
    if (state.sourceRoots.isEmpty()) return;

    String sourceLevel = module["sourceLevel"]
    String targetLevel = module["targetLevel"]
    String customArgs = module["javac_args"]; // it seems javac_args property is not set, can we drop it?
    if (projectBuilder.useInProcessJavac) {
      String version = System.getProperty("java.version")
      if (true) {
        if (Java16ApiCompilerRunner.compile(module, projectBuilder, state, sourceLevel, targetLevel, customArgs)) {
          return
        }
      }
      else {
        projectBuilder.info("In-process Javac won't be used for '${module.name}', because Java version ($version) doesn't match to source level ($sourceLevel)")
      }
    }

    def params = [:]
    params.destdir = state.targetFolder
    if (sourceLevel != null) params.source = sourceLevel
    if (targetLevel != null) params.target = targetLevel

    def javacOpts = module.project.compilerConfiguration.javacOptions;
    def memHeapSize = javacOpts["MAXIMUM_HEAP_SIZE"] == null ? "512m" : javacOpts["MAXIMUM_HEAP_SIZE"] + "m";
    def boolean debugInfo = !"false".equals(javacOpts["DEBUGGING_INFO"]);
    def boolean nowarn = "true".equals(javacOpts["GENERATE_NO_WARNINGS"]);
    def boolean deprecation = !"false".equals(javacOpts["DEPRECATION"]);
    customArgs = javacOpts["ADDITIONAL_OPTIONS_STRING"];
    if ((customArgs == null || customArgs.indexOf("-encoding") == -1) && module.project.projectCharset != null) {
      params.encoding = module.project.projectCharset;
    }

    params.fork = "true"
    params.memoryMaximumSize = memHeapSize;
    params.debug = String.valueOf(debugInfo);
    params.nowarn = String.valueOf(nowarn);
    params.deprecation = String.valueOf(deprecation);
    params.verbose = "true"

    def javacExecutable = getJavacExecutable(module)
    if (javacExecutable != null) {
      params.executable = javacExecutable
    }

    def ant = projectBuilder.binding.ant

    if (state.projectWrapper != null) {
      final BuildListener listener = new AntListener(state.targetFolder, state.sourceRoots, state.callback)
      ant.project.addBuildListener(listener)
    };

    ant.javac(params) {
      if (customArgs) {
        compilerarg(line: customArgs)
      }

      if (state.projectWrapper != null && state.sourceFiles != null) {
        List patterns = []

        state.sourceFiles.each {
          for (String root: state.sourceRoots) {
            if (it.startsWith(root) && it.endsWith(".java")) {
              patterns << it.substring(root.length() + 1)
              break;
            }
          }

          patterns.each {
            include(name: it)
          }
        }
      }

      state.sourceRoots.each {
        src(path: it)
      }

      state.excludes.each { String root ->
        state.sourceRoots.each {String src ->
          if (root.startsWith("${src}/")) {
            exclude(name: "${root.substring(src.length() + 1)}/**")
          }
        }
      }

      classpath {
        state.classpath.each {
          pathelement(location: it)
        }
      }
    }

    if (state.projectWrapper != null) {
      ant.project.removeBuildListener(listener)
    };

    if (state.sourceFiles != null) {
      projectBuilder.listeners*.onJavaFilesCompiled(module, state.sourceFiles.size())
    }
  }