Merge remote-tracking branch 'origin/master'

This commit is contained in:
Kirill Likhodedov
2012-01-30 11:02:34 +04:00
214 changed files with 1480 additions and 2555 deletions
@@ -23,9 +23,11 @@ import com.intellij.execution.process.OSProcessHandler;
import com.intellij.execution.process.ProcessAdapter;
import com.intellij.execution.process.ProcessEvent;
import com.intellij.execution.process.ProcessOutputTypes;
import com.intellij.notification.Notification;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.PathMacros;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.compiler.CompilerManager;
import com.intellij.openapi.components.ApplicationComponent;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
@@ -40,15 +42,20 @@ import com.intellij.openapi.roots.ModuleRootListener;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.ShutDownTracker;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.JarFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.*;
import com.intellij.openapi.vfs.encoding.EncodingManager;
import com.intellij.openapi.vfs.newvfs.BulkFileListener;
import com.intellij.openapi.vfs.newvfs.events.VFileEvent;
import com.intellij.problems.Problem;
import com.intellij.problems.WolfTheProblemSolver;
import com.intellij.util.Alarm;
import com.intellij.util.concurrency.Semaphore;
import com.intellij.util.messages.MessageBusConnection;
import com.intellij.util.net.NetUtils;
@@ -68,6 +75,7 @@ import java.util.*;
import java.util.concurrent.Future;
import java.util.concurrent.RunnableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* @author Eugene Zhuravlev
@@ -87,6 +95,8 @@ public class CompileServerManager implements ApplicationComponent{
}
});
private final ProjectManager myProjectManager;
private static final int MAKE_TRIGGER_DELAY = 5 * 1000 /*5 seconds*/;
private final Map<RequestFuture, Project> myAutomakeFutures = new HashMap<RequestFuture, Project>();
public CompileServerManager(final ProjectManager projectManager) {
myProjectManager = projectManager;
@@ -101,6 +111,50 @@ public class CompileServerManager implements ApplicationComponent{
mySystemDirectory = system;
projectManager.addProjectManagerListener(new ProjectWatcher());
final MessageBusConnection conn = ApplicationManager.getApplication().getMessageBus().connect();
conn.subscribe(VirtualFileManager.VFS_CHANGES, new BulkFileListener() {
private final Alarm myAlarm = new Alarm(Alarm.ThreadToUse.SHARED_THREAD);
private final AtomicBoolean myAutoMakeInProgress = new AtomicBoolean(false);
@Override
public void before(List<? extends VFileEvent> events) {
}
@Override
public void after(List<? extends VFileEvent> events) {
if (shouldTriggerMake(events)) {
scheduleMake(new Runnable() {
@Override
public void run() {
if (!myAutoMakeInProgress.getAndSet(true)) {
try {
runAutoMake();
}
finally {
myAutoMakeInProgress.set(false);
}
}
else {
scheduleMake(this);
}
}
});
}
}
private void scheduleMake(Runnable runnable) {
myAlarm.cancelAllRequests();
myAlarm.addRequest(runnable, MAKE_TRIGGER_DELAY);
}
private boolean shouldTriggerMake(List<? extends VFileEvent> events) {
for (VFileEvent event : events) {
if (event.isFromRefresh() || event.getRequestor() instanceof SavingRequestor) {
return true;
}
}
return false;
}
});
ShutDownTracker.getInstance().registerShutdownTask(new Runnable() {
@Override
@@ -198,8 +252,60 @@ public class CompileServerManager implements ApplicationComponent{
}
}
private void runAutoMake() {
final Project[] openProjects = ProjectManager.getInstance().getOpenProjects();
if (openProjects.length > 0) {
final List<RequestFuture> futures = new ArrayList<RequestFuture>();
for (final Project project : openProjects) {
if (project.isDefault()) {
continue;
}
final CompilerWorkspaceConfiguration config = CompilerWorkspaceConfiguration.getInstance(project);
if (!config.USE_COMPILE_SERVER || !config.MAKE_PROJECT_ON_SAVE) {
continue;
}
final RequestFuture future = submitCompilationTask(
project, false, true, Collections.<String>emptyList(), Collections.<String>emptyList(), new AutoMakeResponseHandler(project)
);
if (future != null) {
futures.add(future);
synchronized (myAutomakeFutures) {
myAutomakeFutures.put(future, project);
}
}
}
try {
for (RequestFuture future : futures) {
try {
future.get();
}
catch (InterruptedException ignored) {
}
catch (java.util.concurrent.ExecutionException ignored) {
}
}
}
finally {
synchronized (myAutomakeFutures) {
myAutomakeFutures.keySet().removeAll(futures);
}
}
}
}
public void cancelAutoMakeTasks(Project project) {
synchronized (myAutomakeFutures) {
for (Map.Entry<RequestFuture, Project> entry : myAutomakeFutures.entrySet()) {
if (entry.getValue().equals(project)) {
entry.getKey().cancel(true);
}
}
}
}
@Nullable
public RequestFuture submitCompilationTask(final String projectId, final boolean isRebuild, final boolean isMake, final Collection<String> modules, final Collection<String> paths, final JpsServerResponseHandler handler) {
public RequestFuture submitCompilationTask(final Project project, final boolean isRebuild, final boolean isMake, final Collection<String> modules, final Collection<String> paths, final JpsServerResponseHandler handler) {
final String projectId = project.getLocation();
final Ref<RequestFuture> futureRef = new Ref<RequestFuture>(null);
final RunnableFuture future = myTaskExecutor.submit(new Runnable() {
public void run() {
@@ -547,6 +653,88 @@ public class CompileServerManager implements ApplicationComponent{
return builder.toString();
}
private static class AutoMakeResponseHandler extends JpsServerResponseHandler {
private JpsRemoteProto.Message.Response.BuildEvent.Status myBuildStatus;
private final Project myProject;
private final WolfTheProblemSolver myWolf;
public AutoMakeResponseHandler(Project project) {
myProject = project;
myBuildStatus = JpsRemoteProto.Message.Response.BuildEvent.Status.SUCCESS;
myWolf = WolfTheProblemSolver.getInstance(project);
}
@Override
public boolean handleBuildEvent(JpsRemoteProto.Message.Response.BuildEvent event) {
final JpsRemoteProto.Message.Response.BuildEvent.Type type = event.getEventType();
if (type == JpsRemoteProto.Message.Response.BuildEvent.Type.FILES_GENERATED) {
for (JpsRemoteProto.Message.Response.BuildEvent.GeneratedFile gf : event.getGeneratedFilesList()) {
}
}
if (type == JpsRemoteProto.Message.Response.BuildEvent.Type.BUILD_COMPLETED) {
if (event.hasCompletionStatus()) {
myBuildStatus = event.getCompletionStatus();
}
return true;
}
return false;
}
@Override
public void handleCompileMessage(JpsRemoteProto.Message.Response.CompileMessage compileResponse) {
final JpsRemoteProto.Message.Response.CompileMessage.Kind kind = compileResponse.getKind();
if (kind == JpsRemoteProto.Message.Response.CompileMessage.Kind.ERROR) {
informWolf(myProject, compileResponse);
}
}
@Override
public void handleFailure(JpsRemoteProto.Message.Failure failure) {
CompilerManager.NOTIFICATION_GROUP.createNotification("Auto make failure: " + failure.getDescription(), MessageType.INFO);
}
@Override
public void sessionTerminated() {
String statusMessage = "Auto make completed";
switch (myBuildStatus) {
case SUCCESS:
statusMessage = "Auto make completed successfully";
break;
case UP_TO_DATE:
statusMessage = "All files are up-to-date";
break;
case ERRORS:
statusMessage = "Auto make completed with errors";
break;
case CANCELED:
statusMessage = "Auto make has been canceled";
break;
}
final Notification notification = CompilerManager.NOTIFICATION_GROUP.createNotification(statusMessage, MessageType.INFO);
if (!myProject.isDisposed()) {
notification.notify(myProject);
}
}
private void informWolf(Project project, JpsRemoteProto.Message.Response.CompileMessage message) {
final String srcPath = message.getSourceFilePath();
if (srcPath != null && !project.isDisposed()) {
final VirtualFile vFile = LocalFileSystem.getInstance().findFileByPath(srcPath);
if (vFile != null) {
final int line = (int)message.getLine();
final int column = (int)message.getColumn();
if (line > 0 && column > 0) {
final Problem problem = myWolf.convertToProblem(vFile, line, column, new String[]{message.getText()});
myWolf.weHaveGotProblems(vFile, Collections.singletonList(problem));
}
else {
myWolf.queue(vFile);
}
}
}
}
}
private class ProjectWatcher extends ProjectManagerAdapter {
private final Map<Project, MessageBusConnection> myConnections = new HashMap<Project, MessageBusConnection>();
@@ -30,7 +30,6 @@ import com.intellij.compiler.make.DependencyCache;
import com.intellij.compiler.progress.CompilerTask;
import com.intellij.diagnostic.IdeErrorsDialog;
import com.intellij.diagnostic.PluginException;
import com.intellij.notification.NotificationGroup;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.application.Result;
@@ -103,7 +102,6 @@ import java.util.*;
import java.util.concurrent.ExecutionException;
public class CompileDriver {
private static final NotificationGroup NOTIFICATION_GROUP = NotificationGroup.logOnlyGroup("Compiler");
private static final Logger LOG = Logger.getInstance("#com.intellij.compiler.impl.CompileDriver");
// to be used in tests only for debug output
@@ -425,9 +423,10 @@ public class CompileDriver {
moduleNames.add(module.getName());
}
}
final CompileServerManager jpsServerManager = CompileServerManager.getInstance();
final CompileServerManager csManager = CompileServerManager.getInstance();
final MessageBus messageBus = myProject.getMessageBus();
return jpsServerManager.submitCompilationTask(myProject.getLocation(), compileContext.isRebuild(), compileContext.isMake(), moduleNames, paths, new JpsServerResponseHandler() {
csManager.cancelAutoMakeTasks(myProject);
return csManager.submitCompilationTask(myProject, compileContext.isRebuild(), compileContext.isMake(), moduleNames, paths, new JpsServerResponseHandler() {
@Override
public void handleCompileMessage(JpsRemoteProto.Message.Response.CompileMessage compilerMessage) {
@@ -807,7 +806,7 @@ public class CompileDriver {
ToolWindowManager.getInstance(myProject).notifyByBalloon(ToolWindowId.MESSAGES_WINDOW, messageType, statusMessage);
}
NOTIFICATION_GROUP.createNotification(_status == ExitStatus.UP_TO_DATE ? "Compilation: all files are up to date" : statusMessage, messageType).notify(myProject);
CompilerManager.NOTIFICATION_GROUP.createNotification(_status == ExitStatus.UP_TO_DATE ? "Compilation: all files are up to date" : statusMessage, messageType).notify(myProject);
if (_status != ExitStatus.UP_TO_DATE && compileContext.getMessageCount(null) > 0) {
compileContext.addMessage(CompilerMessageCategory.INFORMATION, statusMessage, null, -1, -1);
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.compiler.options.CompilerUIConfigurable">
<grid id="1663f" binding="myPanel" layout-manager="GridLayoutManager" row-count="7" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<grid id="1663f" binding="myPanel" layout-manager="GridLayoutManager" row-count="8" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="28" y="24" width="883" height="379"/>
@@ -10,7 +10,7 @@
<children>
<vspacer id="67edf">
<constraints>
<grid row="6" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
<grid row="7" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
</constraints>
</vspacer>
<grid id="b341d" layout-manager="GridLayoutManager" row-count="2" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
@@ -93,6 +93,14 @@
<text value="Use compile server for project compilation"/>
</properties>
</component>
<component id="b9b2d" class="javax.swing.JCheckBox" binding="myCbMakeProjectOnSave">
<constraints>
<grid row="6" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="2" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Perform project make on save"/>
</properties>
</component>
</children>
</grid>
</form>
@@ -25,6 +25,8 @@ import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
@@ -40,6 +42,7 @@ public class CompilerUIConfigurable implements SearchableConfigurable, Configura
private JLabel myPatternLegendLabel;
private JCheckBox myCbAutoShowFirstError;
private JCheckBox myCbUseCompileServer;
private JCheckBox myCbMakeProjectOnSave;
public CompilerUIConfigurable(final Project project) {
myProject = project;
@@ -49,6 +52,12 @@ public class CompilerUIConfigurable implements SearchableConfigurable, Configura
"<b>/</b> &mdash; path separator; <b>/**/</b> &mdash; any number of directories; " +
"<i>&lt;dir_name&gt;</i>:<i>&lt;pattern&gt;</i> &mdash; restrict to source roots with the specified name" +
"</html>");
myCbUseCompileServer.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
myCbMakeProjectOnSave.setEnabled(myCbUseCompileServer.isSelected());
}
});
}
public void reset() {
@@ -60,6 +69,8 @@ public class CompilerUIConfigurable implements SearchableConfigurable, Configura
myCbClearOutputDirectory.setSelected(workspaceConfiguration.CLEAR_OUTPUT_DIRECTORY);
myCbAssertNotNull.setSelected(workspaceConfiguration.ASSERT_NOT_NULL);
myCbUseCompileServer.setSelected(workspaceConfiguration.USE_COMPILE_SERVER);
myCbMakeProjectOnSave.setSelected(workspaceConfiguration.MAKE_PROJECT_ON_SAVE);
myCbMakeProjectOnSave.setEnabled(workspaceConfiguration.USE_COMPILE_SERVER);
configuration.convertPatterns();
@@ -86,6 +97,7 @@ public class CompilerUIConfigurable implements SearchableConfigurable, Configura
workspaceConfiguration.CLEAR_OUTPUT_DIRECTORY = myCbClearOutputDirectory.isSelected();
workspaceConfiguration.ASSERT_NOT_NULL = myCbAssertNotNull.isSelected();
workspaceConfiguration.USE_COMPILE_SERVER = myCbUseCompileServer.isSelected();
workspaceConfiguration.MAKE_PROJECT_ON_SAVE = myCbMakeProjectOnSave.isSelected();
configuration.removeResourceFilePatterns();
String extensionString = myResourcePatternsField.getText().trim();
@@ -143,6 +155,7 @@ public class CompilerUIConfigurable implements SearchableConfigurable, Configura
isModified |= ComparingUtils.isModified(myCbAutoShowFirstError, workspaceConfiguration.AUTO_SHOW_ERRORS_IN_EDITOR);
isModified |= ComparingUtils.isModified(myCbAssertNotNull, workspaceConfiguration.ASSERT_NOT_NULL);
isModified |= ComparingUtils.isModified(myCbUseCompileServer, workspaceConfiguration.USE_COMPILE_SERVER);
isModified |= ComparingUtils.isModified(myCbMakeProjectOnSave, workspaceConfiguration.MAKE_PROJECT_ON_SAVE);
final CompilerConfigurationImpl compilerConfiguration = (CompilerConfigurationImpl)CompilerConfiguration.getInstance(myProject);
isModified |= ComparingUtils.isModified(myCbClearOutputDirectory, workspaceConfiguration.CLEAR_OUTPUT_DIRECTORY);
@@ -41,6 +41,7 @@ public class CompilerWorkspaceConfiguration implements PersistentStateComponent<
public boolean CLEAR_OUTPUT_DIRECTORY = true;
public boolean ASSERT_NOT_NULL = true;
public boolean USE_COMPILE_SERVER = false;
public boolean MAKE_PROJECT_ON_SAVE = false;
public static CompilerWorkspaceConfiguration getInstance(Project project) {
return ServiceManager.getService(project, CompilerWorkspaceConfiguration.class);
@@ -15,6 +15,7 @@
*/
package com.intellij.openapi.compiler;
import com.intellij.notification.NotificationGroup;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.fileTypes.FileType;
@@ -34,6 +35,8 @@ import java.util.Set;
*/
public abstract class CompilerManager {
public static final Key<Key> CONTENT_ID_KEY = Key.create("COMPILATION_CONTENT_ID_CUSTOM_KEY");
public static final NotificationGroup NOTIFICATION_GROUP = NotificationGroup.logOnlyGroup("Compiler");
/**
* Returns the compiler manager instance for the specified project.
*
@@ -24,10 +24,7 @@ import com.intellij.openapi.roots.LanguageLevelModuleExtension;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.testFramework.IdeaTestCase;
import com.intellij.testFramework.LightProjectDescriptor;
import com.intellij.testFramework.PlatformTestUtil;
import com.intellij.testFramework.UsefulTestCase;
import com.intellij.testFramework.*;
import com.intellij.testFramework.fixtures.impl.LightTempDirTestFixtureImpl;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -55,6 +52,11 @@ public abstract class LightCodeInsightFixtureTestCase extends UsefulTestCase{
IdeaTestCase.initPlatformPrefix();
}
@SuppressWarnings("JUnitTestCaseWithNonTrivialConstructors")
public LightCodeInsightFixtureTestCase(String classToTest, String prefix) {
PlatformTestCase.initPlatformPrefix(classToTest, prefix);
}
@Override
protected void setUp() throws Exception {
super.setUp();
@@ -1,17 +0,0 @@
package org.jetbrains.jps.api;
/**
* @author Eugene Zhuravlev
* Date: 9/10/11
*/
public class BuildParameters {
public BuildType buildType = BuildType.MAKE;
public boolean useInProcessJavac = true;
public BuildParameters() {
}
public BuildParameters(BuildType buildType) {
this.buildType = buildType;
}
}
@@ -7,7 +7,7 @@ import org.jetbrains.jps.client.ProtobufResponseHandler;
* @author Eugene Zhuravlev
* Date: 8/15/11
*/
public class JpsServerResponseHandler implements ProtobufResponseHandler {
public abstract class JpsServerResponseHandler implements ProtobufResponseHandler {
public final boolean handleMessage(MessageLite msg) throws Exception {
final JpsRemoteProto.Message message = (JpsRemoteProto.Message)msg;
@@ -40,15 +40,11 @@ public class JpsServerResponseHandler implements ProtobufResponseHandler {
* @param event
* @return true if session should be terminated, false otherwise
*/
public boolean handleBuildEvent(JpsRemoteProto.Message.Response.BuildEvent event) {
return false;
}
public abstract boolean handleBuildEvent(JpsRemoteProto.Message.Response.BuildEvent event);
public void handleCompileMessage(JpsRemoteProto.Message.Response.CompileMessage compileResponse) {
}
public abstract void handleCompileMessage(JpsRemoteProto.Message.Response.CompileMessage compileResponse);
public void handleFailure(JpsRemoteProto.Message.Failure failure) {
}
public abstract void handleFailure(JpsRemoteProto.Message.Failure failure);
public void sessionTerminated() {
}
@@ -1,4 +1,4 @@
package com.intellij.compiler;
package org.jetbrains.jps.api;
import java.util.Queue;
import java.util.concurrent.FutureTask;
@@ -29,6 +29,7 @@ import java.util.concurrent.ExecutionException;
*/
public class IncProjectBuilder {
private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.incremental.IncProjectBuilder");
public static final String JPS_SERVER_NAME = "JPS BUILD";
private static final String CANCELED_MESSAGE = "The build has been canceled";
@@ -56,7 +57,7 @@ public class IncProjectBuilder {
myCancelStatus = cs;
myProductionChunks = new ProjectChunks(pd.project, ClasspathKind.PRODUCTION_COMPILE);
myTestChunks = new ProjectChunks(pd.project, ClasspathKind.TEST_COMPILE);
myTotalModulesWork = (float) pd.rootsIndex.getTotalModuleCount() * 2; /* multiply by 2 to reflect production and test sources */
myTotalModulesWork = (float)pd.rootsIndex.getTotalModuleCount() * 2; /* multiply by 2 to reflect production and test sources */
myTotalBuilderCount = builderRegistry.getTotalBuilderCount();
}
@@ -74,10 +75,9 @@ public class IncProjectBuilder {
catch (ProjectBuildException e) {
if (e.getCause() instanceof PersistentEnumerator.CorruptedException) {
// force rebuild
myMessageDispatcher.processMessage(new CompilerMessage(
JPS_SERVER_NAME, BuildMessage.Kind.INFO,
"Internal caches are corrupted or have outdated format, forcing project rebuild: " + e.getMessage())
);
myMessageDispatcher.processMessage(new CompilerMessage(JPS_SERVER_NAME, BuildMessage.Kind.INFO,
"Internal caches are corrupted or have outdated format, forcing project rebuild: " +
e.getMessage()));
flushContext(context);
context = createContext(new AllProjectScope(scope.getProject(), true), false, true);
runBuild(context);
@@ -122,6 +122,7 @@ public class IncProjectBuilder {
}
private static boolean ourClenupFailed = false;
private static void cleanupJavacNameTable() {
try {
if (JavaBuilder.USE_EMBEDDED_JAVAC && !ourClenupFailed) {
@@ -168,9 +169,8 @@ public class IncProjectBuilder {
final FSState fsState = myProjectDescriptor.fsState;
final ModuleRootsIndex rootsIndex = myProjectDescriptor.rootsIndex;
final BuildDataManager dataManager = myProjectDescriptor.dataManager;
return new CompileContext(
scope, isMake, isProjectRebuild, myProductionChunks, myTestChunks, fsState, dataManager, tsStorage, myMessageDispatcher, rootsIndex, myCancelStatus
);
return new CompileContext(scope, isMake, isProjectRebuild, myProductionChunks, myTestChunks, fsState, dataManager, tsStorage,
myMessageDispatcher, rootsIndex, myCancelStatus);
}
private void cleanOutputRoots(CompileContext context) throws ProjectBuildException {
@@ -235,7 +235,9 @@ public class IncProjectBuilder {
}
}
else {
context.processMessage(new CompilerMessage(JPS_SERVER_NAME, BuildMessage.Kind.WARNING, "Output path " + outputRoot.getPath() + " intersects with a source root. The output cannot be cleaned."));
context.processMessage(new CompilerMessage(JPS_SERVER_NAME, BuildMessage.Kind.WARNING, "Output path " +
outputRoot.getPath() +
" intersects with a source root. The output cannot be cleaned."));
}
}
@@ -262,7 +264,7 @@ public class IncProjectBuilder {
}
}
private void buildChunk(CompileContext context, ModuleChunk chunk) throws ProjectBuildException{
private void buildChunk(CompileContext context, ModuleChunk chunk) throws ProjectBuildException {
try {
context.ensureFSStateInitialized(chunk);
if (context.isMake()) {
@@ -275,7 +277,8 @@ public class IncProjectBuilder {
allChunkRemovedSources.addAll(deletedPaths);
final String moduleName = module.getName().toLowerCase(Locale.US);
final SourceToOutputMapping sourceToOutputStorage = context.getDataManager().getSourceToOutputMap(moduleName, context.isCompilingTests());
final SourceToOutputMapping sourceToOutputStorage =
context.getDataManager().getSourceToOutputMap(moduleName, context.isCompilingTests());
// actually delete outputs associated with removed paths
for (String deletedSource : deletedPaths) {
// deleting outputs corresponding to non-existing source
@@ -383,12 +386,13 @@ public class IncProjectBuilder {
while (nextPassRequired);
}
private static void syncOutputFiles(CompileContext context, ModuleChunk chunk) throws ProjectBuildException {
private static void syncOutputFiles(final CompileContext context, ModuleChunk chunk) throws ProjectBuildException {
final BuildDataManager dataManager = context.getDataManager();
final boolean compilingTests = context.isCompilingTests();
try {
context.processFilesToRecompile(chunk, new FileProcessor() {
private final Map<Module, SourceToOutputMapping> storageMap = new HashMap<Module, SourceToOutputMapping>();
@Override
public boolean apply(Module module, File file, String sourceRoot) throws Exception {
SourceToOutputMapping srcToOut = storageMap.get(module);
@@ -398,6 +402,23 @@ public class IncProjectBuilder {
}
final String srcPath = FileUtil.toSystemIndependentName(file.getPath());
final Collection<String> outputs = srcToOut.getState(srcPath);
if (LOG.isDebugEnabled()) {
if (outputs != null && context.isMake()) {
LOG.info("Cleaning output files:");
final String[] buffer = new String[outputs.size()];
int i = 0;
for (String output : outputs) {
buffer[i++] = output;
}
Arrays.sort(buffer);
for (String output : buffer) {
LOG.info(output);
}
LOG.info("End of files");
}
}
if (outputs != null) {
for (String output : outputs) {
FileUtil.delete(new File(output));
@@ -3,6 +3,7 @@ package org.jetbrains.jps.incremental.java;
import com.intellij.compiler.notNullVerification.NotNullVerifyingInstrumenter;
import com.intellij.execution.process.BaseOSProcessHandler;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.io.FileUtil;
@@ -34,7 +35,8 @@ import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.commons.EmptyVisitor;
import javax.tools.*;
import javax.tools.Diagnostic;
import javax.tools.JavaFileObject;
import java.io.*;
import java.net.MalformedURLException;
import java.net.ServerSocket;
@@ -49,6 +51,8 @@ import java.util.concurrent.ExecutorService;
* Date: 9/21/11
*/
public class JavaBuilder extends ModuleLevelBuilder {
private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.incremental.java.JavaBuilder");
public static final String BUILDER_NAME = "java";
private static final String JAVA_EXTENSION = ".java";
private static final String FORM_EXTENSION = ".form";
@@ -171,6 +175,21 @@ public class JavaBuilder extends ModuleLevelBuilder {
}
}
if (LOG.isDebugEnabled()) {
if (filesToCompile.size() > 0 && context.isMake()) {
LOG.info("Compiling files:");
final String[] buffer = new String[filesToCompile.size()];
int i = 0;
for (final File f : filesToCompile) {
buffer[i++] = FileUtil.toSystemIndependentName(f.getCanonicalPath());
}
Arrays.sort(buffer);
for (final String s : buffer) {
LOG.info(s);
}
LOG.info("End of files");
}
}
return compile(context, chunk, filesToCompile, formsToCompile);
}
@@ -199,7 +218,7 @@ public class JavaBuilder extends ModuleLevelBuilder {
while (true) {
final File candidate = new File(srcRoot, relPath);
if (candidate.exists()) {
return candidate.isFile()? candidate : null;
return candidate.isFile() ? candidate : null;
}
final int index = relPath.lastIndexOf('/');
if (index <= 0) {
@@ -209,7 +228,8 @@ public class JavaBuilder extends ModuleLevelBuilder {
}
}
private ExitCode compile(final CompileContext context, ModuleChunk chunk, Collection<File> files, Collection<File> forms) throws Exception {
private ExitCode compile(final CompileContext context, ModuleChunk chunk, Collection<File> files, Collection<File> forms)
throws Exception {
ExitCode exitCode = ExitCode.OK;
final boolean hasSourcesToCompile = !files.isEmpty() || !forms.isEmpty();
@@ -222,8 +242,10 @@ public class JavaBuilder extends ModuleLevelBuilder {
final boolean addNotNullAssertions = context.getProject().getCompilerConfiguration().isAddNotNullAssertions();
final Collection<File> classpath = paths.getCompilationClasspath(chunk, context.isCompilingTests(), false/*context.isProjectRebuild()*/);
final Collection<File> platformCp = paths.getPlatformCompilationClasspath(chunk, context.isCompilingTests(), false/*context.isProjectRebuild()*/);
final Collection<File> classpath =
paths.getCompilationClasspath(chunk, context.isCompilingTests(), false/*context.isProjectRebuild()*/);
final Collection<File> platformCp =
paths.getPlatformCompilationClasspath(chunk, context.isCompilingTests(), false/*context.isProjectRebuild()*/);
final Map<File, Set<File>> outs = buildOutputDirectoriesMap(context, chunk);
// begin compilation round
@@ -233,11 +255,9 @@ public class JavaBuilder extends ModuleLevelBuilder {
DELTA_MAPPINGS_CALLBACK_KEY.set(context, delta.getCallback());
try {
if (hasSourcesToCompile) {
final Set<File> sourcePath = TEMPORARY_SOURCE_ROOTS_KEY.get(context,Collections.<File>emptySet());
final Set<File> sourcePath = TEMPORARY_SOURCE_ROOTS_KEY.get(context, Collections.<File>emptySet());
final boolean compiledOk = compileJava(
files, classpath, platformCp, sourcePath, outs, context, diagnosticSink, outputSink
);
final boolean compiledOk = compileJava(files, classpath, platformCp, sourcePath, outs, context, diagnosticSink, outputSink);
final Map<File, String> chunkSourcePath = ProjectPaths.getSourceRootsWithDependents(chunk, context.isCompilingTests());
final ClassLoader compiledClassesLoader = createInstrumentationClassLoader(classpath, platformCp, chunkSourcePath, outputSink);
@@ -266,7 +286,8 @@ public class JavaBuilder extends ModuleLevelBuilder {
throw new ProjectBuildException("Compilation failed: internal java compiler error");
}
if (diagnosticSink.getErrorCount() > 0) {
throw new ProjectBuildException("Compilation failed: errors: " + diagnosticSink.getErrorCount() + "; warnings: " + diagnosticSink.getWarningCount());
throw new ProjectBuildException(
"Compilation failed: errors: " + diagnosticSink.getErrorCount() + "; warnings: " + diagnosticSink.getWarningCount());
}
}
}
@@ -291,17 +312,26 @@ public class JavaBuilder extends ModuleLevelBuilder {
return exitCode;
}
private boolean compileJava(Collection<File> files, Collection<File> classpath, Collection<File> platformCp, Collection<File> sourcePath, Map<File, Set<File>> outs, CompileContext context, DiagnosticOutputConsumer diagnosticSink, final OutputFileConsumer outputSink) throws Exception {
private boolean compileJava(Collection<File> files,
Collection<File> classpath,
Collection<File> platformCp,
Collection<File> sourcePath,
Map<File, Set<File>> outs,
CompileContext context,
DiagnosticOutputConsumer diagnosticSink,
final OutputFileConsumer outputSink) throws Exception {
final List<String> options = getCompilationOptions(context);
final ClassProcessingConsumer classesConsumer = new ClassProcessingConsumer(context, outputSink);
try {
final boolean rc;
if (USE_EMBEDDED_JAVAC) {
rc = JavacMain.compile(options, files, classpath, platformCp, sourcePath, outs, diagnosticSink, classesConsumer, context.getCancelStatus());
rc = JavacMain
.compile(options, files, classpath, platformCp, sourcePath, outs, diagnosticSink, classesConsumer, context.getCancelStatus());
}
else {
final JavacServerClient client = ensureJavacServerLaunched(context);
final RequestFuture<JavacServerResponseHandler> future = client.sendCompileRequest(options, files, classpath, platformCp, sourcePath, outs, diagnosticSink, classesConsumer);
final RequestFuture<JavacServerResponseHandler> future =
client.sendCompileRequest(options, files, classpath, platformCp, sourcePath, outs, diagnosticSink, classesConsumer);
try {
future.get();
}
@@ -331,9 +361,8 @@ public class JavaBuilder extends ModuleLevelBuilder {
final int port = findFreePort();
final int heapSize = getJavacServerHeapSize(context);
final BaseOSProcessHandler processHandler = JavacServerBootstrap.launchJavacServer(
vmExecPath, heapSize, port, Paths.getSystemRoot(), getCompilationVMOptions(context)
);
final BaseOSProcessHandler processHandler =
JavacServerBootstrap.launchJavacServer(vmExecPath, heapSize, port, Paths.getSystemRoot(), getCompilationVMOptions(context));
final JavacServerClient client = new JavacServerClient();
try {
client.connect(hostString, port);
@@ -355,7 +384,7 @@ public class JavaBuilder extends ModuleLevelBuilder {
finally {
//workaround for linux : calling close() immediately after opening socket
//may result that socket is not closed
synchronized(serverSocket) {
synchronized (serverSocket) {
try {
serverSocket.wait(1);
}
@@ -386,8 +415,10 @@ public class JavaBuilder extends ModuleLevelBuilder {
return heapSize;
}
private static ClassLoader createInstrumentationClassLoader(Collection<File> classpath, Collection<File> platformCp, Map<File, String> chunkSourcePath, OutputFilesSink outputSink)
throws MalformedURLException {
private static ClassLoader createInstrumentationClassLoader(Collection<File> classpath,
Collection<File> platformCp,
Map<File, String> chunkSourcePath,
OutputFilesSink outputSink) throws MalformedURLException {
final List<URL> urls = new ArrayList<URL>();
for (Collection<File> cp : Arrays.asList(platformCp, classpath)) {
for (File file : cp) {
@@ -448,9 +479,9 @@ public class JavaBuilder extends ModuleLevelBuilder {
boolean isEncodingSet = false;
if (customArgs != null) {
final StringTokenizer tokenizer = new StringTokenizer(customArgs, " \t\r\n");
while(tokenizer.hasMoreTokens()) {
while (tokenizer.hasMoreTokens()) {
final String token = tokenizer.nextToken();
if ("-g".equals(token) || "-deprecation".equals(token) || "-nowarn".equals(token) || "-verbose".equals(token)){
if ("-g".equals(token) || "-deprecation".equals(token) || "-nowarn".equals(token) || "-verbose".equals(token)) {
continue;
}
if (token.startsWith("-J-")) {
@@ -534,13 +565,12 @@ public class JavaBuilder extends ModuleLevelBuilder {
}
}
private static void instrumentForms(
CompileContext context,
ModuleChunk chunk,
final Map<File, String> chunkSourcePath,
final ClassLoader loader,
Collection<File> formsToInstrument,
OutputFilesSink outputSink) throws ProjectBuildException {
private static void instrumentForms(CompileContext context,
ModuleChunk chunk,
final Map<File, String> chunkSourcePath,
final ClassLoader loader,
Collection<File> formsToInstrument,
OutputFilesSink outputSink) throws ProjectBuildException {
final Map<String, File> class2form = new HashMap<String, File>();
final SourceToFormMapping sourceToFormMap = context.getDataManager().getSourceToFormMap();
@@ -550,9 +580,8 @@ public class JavaBuilder extends ModuleLevelBuilder {
compiledClassNames.put(fileObject.getClassName(), fileObject);
}
final MyNestedFormLoader nestedFormsLoader = new MyNestedFormLoader(
chunkSourcePath, ProjectPaths.getOutputPathsWithDependents(chunk, context.isCompilingTests())
);
final MyNestedFormLoader nestedFormsLoader =
new MyNestedFormLoader(chunkSourcePath, ProjectPaths.getOutputPathsWithDependents(chunk, context.isCompilingTests()));
for (File formFile : formsToInstrument) {
final LwRootContainer rootContainer;
@@ -574,17 +603,20 @@ public class JavaBuilder extends ModuleLevelBuilder {
final OutputFileObject outputClassFile = findClassFile(compiledClassNames, classToBind);
if (outputClassFile == null) {
context.processMessage(new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.WARNING, "Class to bind does not exist: " + classToBind, formFile.getAbsolutePath()));
context.processMessage(new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.WARNING, "Class to bind does not exist: " + classToBind,
formFile.getAbsolutePath()));
continue;
}
final File alreadyProcessedForm = class2form.get(classToBind);
if (alreadyProcessedForm != null) {
context.processMessage(new CompilerMessage(
BUILDER_NAME, BuildMessage.Kind.WARNING,
formFile.getAbsolutePath() + ": The form is bound to the class " + classToBind + ".\nAnother form " + alreadyProcessedForm.getAbsolutePath() + " is also bound to this class",
formFile.getAbsolutePath())
);
context.processMessage(new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.WARNING, formFile.getAbsolutePath() +
": The form is bound to the class " +
classToBind +
".\nAnother form " +
alreadyProcessedForm.getAbsolutePath() +
" is also bound to this class",
formFile.getAbsolutePath()));
continue;
}
@@ -593,7 +625,8 @@ public class JavaBuilder extends ModuleLevelBuilder {
boolean success = true;
try {
final OutputFileObject.Content originalContent = outputClassFile.getContent();
final ClassReader classReader = new ClassReader(originalContent.getBuffer(), originalContent.getOffset(), originalContent.getLength());
final ClassReader classReader =
new ClassReader(originalContent.getBuffer(), originalContent.getOffset(), originalContent.getLength());
final int version = getClassFileVersion(classReader);
final InstrumenterClassWriter classWriter = new InstrumenterClassWriter(getAsmClassWriterFlags(version), loader);
@@ -605,7 +638,8 @@ public class JavaBuilder extends ModuleLevelBuilder {
final FormErrorInfo[] warnings = codeGenerator.getWarnings();
for (final FormErrorInfo warning : warnings) {
context.processMessage(new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.WARNING, warning.getErrorMessage(), formFile.getAbsolutePath()));
context.processMessage(
new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.WARNING, warning.getErrorMessage(), formFile.getAbsolutePath()));
}
final FormErrorInfo[] errors = codeGenerator.getErrors();
@@ -629,7 +663,8 @@ public class JavaBuilder extends ModuleLevelBuilder {
}
catch (Exception e) {
success = false;
context.processMessage(new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.ERROR, "Forms instrumentation failed" + e.getMessage(), formFile.getAbsolutePath()));
context.processMessage(new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.ERROR, "Forms instrumentation failed" + e.getMessage(),
formFile.getAbsolutePath()));
}
finally {
if (!success) {
@@ -713,13 +748,12 @@ public class JavaBuilder extends ModuleLevelBuilder {
kind = BuildMessage.Kind.INFO;
}
final JavaFileObject source = diagnostic.getSource();
final File sourceFile = source != null? Paths.convertToFile(source.toUri()) : null;
final String srcPath = sourceFile != null? FileUtil.toSystemIndependentName(sourceFile.getPath()) : null;
myContext.processMessage(new CompilerMessage(
BUILDER_NAME, kind, diagnostic.getMessage(Locale.US), srcPath,
diagnostic.getStartPosition(), diagnostic.getEndPosition(), diagnostic.getPosition(),
diagnostic.getLineNumber(), diagnostic.getColumnNumber()
));
final File sourceFile = source != null ? Paths.convertToFile(source.toUri()) : null;
final String srcPath = sourceFile != null ? FileUtil.toSystemIndependentName(sourceFile.getPath()) : null;
myContext.processMessage(
new CompilerMessage(BUILDER_NAME, kind, diagnostic.getMessage(Locale.US), srcPath, diagnostic.getStartPosition(),
diagnostic.getEndPosition(), diagnostic.getPosition(), diagnostic.getLineNumber(),
diagnostic.getColumnNumber()));
}
public int getErrorCount() {
@@ -762,7 +796,7 @@ public class JavaBuilder extends ModuleLevelBuilder {
public OutputFileObject.Content lookupClassBytes(String className) {
synchronized (myCompiledClasses) {
final OutputFileObject object = myCompiledClasses.get(className);
return object != null? object.getContent() : null;
return object != null ? object.getContent() : null;
}
}
@@ -979,7 +1013,7 @@ public class JavaBuilder extends ModuleLevelBuilder {
public ClassProcessingConsumer(CompileContext compileContext, OutputFileConsumer sink) {
myCompileContext = compileContext;
myDelegateOutputFileSink = sink != null? sink : new OutputFileConsumer() {
myDelegateOutputFileSink = sink != null ? sink : new OutputFileConsumer() {
public void save(@NotNull OutputFileObject fileObject) {
throw new RuntimeException("Output sink for compiler was not specified");
}
@@ -34,7 +34,9 @@ public abstract class AbstractStateStorage<Key, T> {
public void dropMemoryCache() {
synchronized (myDataLock) {
myMap.dropMemoryCaches();
if (myMap.isDirty()) {
myMap.dropMemoryCaches();
}
}
}
@@ -4,6 +4,7 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.Ref;
import org.jboss.netty.channel.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.api.*;
import org.jetbrains.jps.incremental.MessageHandler;
@@ -13,8 +14,9 @@ import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.PrintStream;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.RunnableFuture;
/**
* @author Eugene Zhuravlev
@@ -23,7 +25,8 @@ import java.util.concurrent.ExecutorService;
class ServerMessageHandler extends SimpleChannelHandler {
private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.server.ServerMessageHandler");
private final ConcurrentHashMap<String, CompilationTask> myBuildsInProgress = new ConcurrentHashMap<String, CompilationTask>();
private final Map<String, SequentialTaskExecutor> myTaskExecutors = new HashMap<String, SequentialTaskExecutor>();
private final List<Pair<RunnableFuture, CompilationTask>> myBuildsInProgress = Collections.synchronizedList(new LinkedList<Pair<RunnableFuture, CompilationTask>>());
private final ExecutorService myBuildsExecutor;
private final Server myServer;
@@ -60,10 +63,16 @@ class ServerMessageHandler extends SimpleChannelHandler {
case CANCEL_BUILD_COMMAND:
final JpsRemoteProto.Message.Request.CancelBuildCommand cancelCommand = request.getCancelBuildCommand();
final UUID targetSessionId = ProtoUtil.fromProtoUUID(cancelCommand.getTargetSessionId());
for (CompilationTask task : myBuildsInProgress.values()) {
if (task.getSessionId().equals(targetSessionId)) {
task.cancel();
break;
synchronized (myBuildsInProgress) {
for (Iterator<Pair<RunnableFuture, CompilationTask>> it = myBuildsInProgress.iterator(); it.hasNext(); ) {
final Pair<RunnableFuture, CompilationTask> pair = it.next();
final CompilationTask task = pair.second;
if (task.getSessionId().equals(targetSessionId)) {
it.remove();
task.cancel();
pair.first.cancel(true);
break;
}
}
}
reply = ProtoUtil.toMessage(sessionId, ProtoUtil.createCommandCompletedEvent(null));
@@ -91,19 +100,30 @@ class ServerMessageHandler extends SimpleChannelHandler {
// todo pay attention to policy
myBuildsExecutor.submit(new Runnable() {
public void run() {
for (Map.Entry<String, CompilationTask> entry : myBuildsInProgress.entrySet()) {
final CompilationTask task = entry.getValue();
task.cancel();
final List<RunnableFuture> futures = new ArrayList<RunnableFuture>();
synchronized (myBuildsInProgress) {
for (Iterator<Pair<RunnableFuture, CompilationTask>> it = myBuildsInProgress.iterator(); it.hasNext(); ) {
final Pair<RunnableFuture, CompilationTask> pair = it.next();
it.remove();
pair.second.cancel();
final RunnableFuture future = pair.first;
futures.add(future);
future.cancel(true);
}
}
facade.clearCahedState();
while (!myBuildsInProgress.isEmpty()) {
// wait until really stopped
for (RunnableFuture future : futures) {
try {
Thread.sleep(100L);
future.get();
}
catch (InterruptedException ignored) {
}
catch (ExecutionException ignored) {
}
}
myServer.stop();
@@ -149,19 +169,15 @@ class ServerMessageHandler extends SimpleChannelHandler {
switch (compileType) {
// todo
case CLEAN:
case MAKE:
case FORCED_COMPILATION:
case REBUILD: {
final CompilationTask task = new CompilationTask(sessionId, channelContext, projectId, compileRequest.getModuleNameList(), compileRequest.getFilePathList());
if (myBuildsInProgress.putIfAbsent(projectId, task) == null) {
task.getBuildParams().buildType = convertCompileType(compileType);
task.getBuildParams().useInProcessJavac = true;
myBuildsExecutor.submit(task);
}
else {
return ProtoUtil.toMessage(sessionId, ProtoUtil.createFailure("Project is being compiled already"));
}
final BuildType buildType = convertCompileType(compileType);
final CompilationTask task = new CompilationTask(
sessionId, channelContext, projectId, buildType, compileRequest.getModuleNameList(), compileRequest.getFilePathList()
);
final RunnableFuture future = getCompileTaskExecutor(projectId).submit(task);
myBuildsInProgress.add(new Pair<RunnableFuture, CompilationTask>(future, task));
return null;
}
@@ -170,6 +186,23 @@ class ServerMessageHandler extends SimpleChannelHandler {
}
}
@NotNull
private SequentialTaskExecutor getCompileTaskExecutor(String projectId) {
synchronized (myTaskExecutors) {
SequentialTaskExecutor executor = myTaskExecutors.get(projectId);
if (executor == null) {
executor = new SequentialTaskExecutor(new SequentialTaskExecutor.AsyncTaskExecutor() {
@Override
public void submit(Runnable runnable) {
myBuildsExecutor.submit(runnable);
}
});
myTaskExecutors.put(projectId, executor);
}
return executor;
}
}
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
if (this == ctx.getPipeline().getLast()) {
LOG.error(e);
@@ -182,22 +215,23 @@ class ServerMessageHandler extends SimpleChannelHandler {
private final UUID mySessionId;
private final ChannelHandlerContext myChannelContext;
private final String myProjectPath;
private final BuildType myBuildType;
private final Collection<String> myPaths;
private final Set<String> myModules;
private final BuildParameters myParams;
private volatile boolean myCanceled = false;
public CompilationTask(UUID sessionId, ChannelHandlerContext channelContext, String projectId, Collection<String> modules, Collection<String> paths) {
public CompilationTask(UUID sessionId,
ChannelHandlerContext channelContext,
String projectId,
BuildType buildType,
Collection<String> modules,
Collection<String> paths) {
mySessionId = sessionId;
myChannelContext = channelContext;
myProjectPath = projectId;
myBuildType = buildType;
myPaths = paths;
myModules = new HashSet<String>(modules);
myParams = new BuildParameters();
}
public BuildParameters getBuildParams() {
return myParams;
}
public UUID getSessionId() {
@@ -214,7 +248,7 @@ class ServerMessageHandler extends SimpleChannelHandler {
final Ref<Boolean> hasErrors = new Ref<Boolean>(false);
final Ref<Boolean> markedFilesUptodate = new Ref<Boolean>(false);
try {
ServerState.getInstance().startBuild(myProjectPath, myModules, myPaths, myParams, new MessageHandler() {
ServerState.getInstance().startBuild(myProjectPath, myBuildType, myModules, myPaths, new MessageHandler() {
public void processMessage(BuildMessage buildMessage) {
final JpsRemoteProto.Message.Response response;
if (buildMessage instanceof FileGeneratedEvent) {
@@ -299,7 +333,16 @@ class ServerMessageHandler extends SimpleChannelHandler {
finally {
Channels.write(myChannelContext.getChannel(), lastMessage).addListener(new ChannelFutureListener() {
public void operationComplete(ChannelFuture future) throws Exception {
myBuildsInProgress.remove(myProjectPath);
final UUID sessionId = getSessionId();
synchronized (myBuildsInProgress) {
for (Iterator<Pair<RunnableFuture, CompilationTask>> it = myBuildsInProgress.iterator(); it.hasNext(); ) {
final CompilationTask task = it.next().second;
if (sessionId.equals(task.getSessionId())) {
it.remove();
break;
}
}
}
}
});
}
@@ -9,7 +9,10 @@ import org.jetbrains.jps.Library;
import org.jetbrains.jps.Module;
import org.jetbrains.jps.Project;
import org.jetbrains.jps.Sdk;
import org.jetbrains.jps.api.*;
import org.jetbrains.jps.api.BuildType;
import org.jetbrains.jps.api.CanceledStatus;
import org.jetbrains.jps.api.GlobalLibrary;
import org.jetbrains.jps.api.SdkLibrary;
import org.jetbrains.jps.idea.IdeaProjectLoader;
import org.jetbrains.jps.incremental.*;
import org.jetbrains.jps.incremental.messages.BuildMessage;
@@ -116,15 +119,15 @@ class ServerState {
}
}
public void startBuild(String projectPath, Set<String> modules, Collection<String> paths, final BuildParameters params, final MessageHandler msgHandler, CanceledStatus cs) throws Throwable{
public void startBuild(String projectPath, BuildType buildType, Set<String> modules, Collection<String> paths, final MessageHandler msgHandler, CanceledStatus cs) throws Throwable{
final String projectName = getProjectName(projectPath);
BuildType buildType = params.buildType;
ProjectDescriptor pd;
synchronized (myConfigurationLock) {
pd = myProjects.get(projectPath);
if (pd == null) {
final Project project = loadProject(projectPath, params);
final Project project = loadProject(projectPath);
final FSState fsState = new FSState(false);
ProjectTimestamps timestamps = null;
BuildDataManager dataManager = null;
@@ -262,7 +265,7 @@ class ServerState {
return name;
}
private Project loadProject(String projectPath, BuildParameters params) {
private Project loadProject(String projectPath) {
final Project project = new Project();
// setup JDKs and global libraries
final MethodClosure fakeClosure = new MethodClosure(new Object(), "hashCode");
@@ -19,7 +19,7 @@ import com.intellij.openapi.diagnostic.Logger;
import junit.framework.TestCase;
import junitx.framework.FileAssert;
import org.apache.log4j.Level;
import org.apache.log4j.xml.DOMConfigurator;
import org.apache.log4j.PropertyConfigurator;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.Project;
@@ -34,6 +34,7 @@ import org.jetbrains.jps.incremental.storage.ProjectTimestamps;
import org.jetbrains.jps.server.ProjectDescriptor;
import java.io.*;
import java.util.Properties;
/**
* Created by IntelliJ IDEA.
@@ -43,6 +44,24 @@ import java.io.*;
* To change this template use File | Settings | File Templates.
*/
public abstract class IncrementalTestCase extends TestCase {
private static class RootStripper {
private String root;
void setRoot(final String root) {
this.root = root;
}
String strip(final String s){
if (s.startsWith(root)) {
return s.substring(root.length());
}
return s;
}
}
private static RootStripper stripper = new RootStripper();
private final String groupName;
private final String tempDir = System.getProperty("java.io.tmpdir");
@@ -55,7 +74,9 @@ public abstract class IncrementalTestCase extends TestCase {
}
@Override
protected void setUp() throws Exception {
protected void setUp() throws Exception {
super.setUp();
baseDir = "jps/testData" + File.separator + "incremental" + File.separator;
for (int i = 0; ; i++) {
@@ -71,6 +92,7 @@ public abstract class IncrementalTestCase extends TestCase {
@Override
protected void tearDown() throws Exception {
super.tearDown();
// delete(new File(workDir));
}
@@ -81,7 +103,7 @@ public abstract class IncrementalTestCase extends TestCase {
final String result = Character.toLowerCase(name.charAt("test".length())) + name.substring("test".length() + 1);
return prefix + File.separator + groupName + File.separator + result;
return prefix + groupName + File.separator + result;
}
private String getBaseDir() {
@@ -94,20 +116,27 @@ public abstract class IncrementalTestCase extends TestCase {
private void delete(final File file) throws Exception {
if (file.isDirectory()) {
for (File f : file.listFiles()) {
delete(f);
final File[] files = file.listFiles();
if (files != null) {
for (File f : files) {
delete(f);
}
}
}
if (!file.delete()) throw new IOException("could not delete file or directory " + file.getPath());
}
private void copy(final File input, final File output) throws Exception {
private static void copy(final File input, final File output) throws Exception {
if (input.isDirectory()) {
if (output.mkdirs()) {
for (File f : input.listFiles()) {
copy(f, new File(output.getPath() + File.separator + f.getName()));
final File[] files = input.listFiles();
if (files != null) {
for (File f : files) {
copy(f, new File(output.getPath() + File.separator + f.getName()));
}
}
}
else {
@@ -117,12 +146,15 @@ public abstract class IncrementalTestCase extends TestCase {
else if (input.isFile()) {
final FileReader in = new FileReader(input);
final FileWriter out = new FileWriter(output);
int c;
while ((c = in.read()) != -1) out.write(c);
in.close();
out.close();
try {
int c;
while ((c = in.read()) != -1) out.write(c);
}
finally {
in.close();
out.close();
}
}
}
@@ -157,61 +189,66 @@ public abstract class IncrementalTestCase extends TestCase {
}
private void initLoggers() {
final String logFile = getWorkDir() + File.separator + "log.xml";
final Properties properties = new Properties();
if (new File(logFile).exists()) {
DOMConfigurator.configure(logFile);
}
properties.setProperty("log4j.rootCategory", "INFO, A1");
properties.setProperty("log4j.appender.A1", "org.apache.log4j.FileAppender");
properties.setProperty("log4j.appender.A1.file", getWorkDir() + ".log");
properties.setProperty("log4j.appender.A1.layout", "org.apache.log4j.PatternLayout");
properties.setProperty("log4j.appender.A1.layout.ConversionPattern", "%m%n");
PropertyConfigurator.configure(properties);
Logger.setFactory(new Logger.Factory() {
@Override
public Logger getLoggerInstance(String category) {
final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(category);
final boolean affectedLogger = category.equals("#org.jetbrains.jps.incremental.java.JavaBuilder") ||
category.equals("#org.jetbrains.jps.incremental.IncProjectBuilder");
final String root = getWorkDir() + File.separator;
final int pos = root.length();
return new Logger() {
@Override
public boolean isDebugEnabled() {
return logger.isDebugEnabled();
return affectedLogger;
}
@Override
public void debug(@NonNls String message) {
logger.debug(message);
}
@Override
public void debug(@Nullable Throwable t) {
logger.debug("", t);
}
@Override
public void debug(@NonNls String message, @Nullable Throwable t) {
logger.debug(message, t);
}
@Override
public void error(@NonNls String message, @Nullable Throwable t, @NonNls String... details) {
logger.debug(message, t);
}
@Override
public void info(@NonNls String message) {
logger.info(message);
if (affectedLogger) {
logger.info(stripper.strip(message));
}
}
@Override
public void info(@NonNls String message, @Nullable Throwable t) {
logger.info(message, t);
}
@Override
public void warn(@NonNls String message, @Nullable Throwable t) {
logger.warn(message, t);
}
@Override
public void setLevel(Level level) {
logger.setLevel(level);
}
};
}
@@ -219,6 +256,8 @@ public abstract class IncrementalTestCase extends TestCase {
}
public void doTest() throws Exception {
stripper.setRoot(getWorkDir() + File.separator);
initLoggers();
final String projectPath = getWorkDir() + File.separator + ".idea";
@@ -108,7 +108,9 @@ public class PersistentMaplet<K, V> implements Maplet<K, V> {
public void flush(boolean memoryCachesOnly) {
if (memoryCachesOnly) {
myMap.dropMemoryCaches();
if (myMap.isDirty()) {
myMap.dropMemoryCaches();
}
}
else {
myMap.force();
@@ -169,7 +169,9 @@ class PersistentMultiMaplet<K, V> implements MultiMaplet<K, V> {
public void flush(boolean memoryCachesOnly) {
if (memoryCachesOnly) {
myMap.dropMemoryCaches();
if (myMap.isDirty()) {
myMap.dropMemoryCaches();
}
}
else {
myMap.force();
@@ -1,15 +1,3 @@
Request to make modules:
module AddAnnotationTarget
End of request
digraph X {
AddAnnotationTarget[label="AddAnnotationTarget"];
}
digraph X {
AddAnnotationTarget[label="AddAnnotationTarget"];
}
Propagated modules:
module AddAnnotationTarget
End of propagated
Cleaning output files:
out/production/AddAnnotationTarget/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module AddAnnotationTypeMemberWithDefaultValue
End of request
digraph X {
AddAnnotationTypeMemberWithDefaultValue[label="AddAnnotationTypeMemberWithDefaultValue"];
}
digraph X {
AddAnnotationTypeMemberWithDefaultValue[label="AddAnnotationTypeMemberWithDefaultValue"];
}
Propagated modules:
module AddAnnotationTypeMemberWithDefaultValue
End of propagated
Cleaning output files:
out/production/AddAnnotationTypeMemberWithDefaultValue/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module AddAnnotationTypeMemberWithDefaultValue2
End of request
digraph X {
AddAnnotationTypeMemberWithDefaultValue2[label="AddAnnotationTypeMemberWithDefaultValue2"];
}
digraph X {
AddAnnotationTypeMemberWithDefaultValue2[label="AddAnnotationTypeMemberWithDefaultValue2"];
}
Propagated modules:
module AddAnnotationTypeMemberWithDefaultValue2
End of propagated
Cleaning output files:
out/production/AddAnnotationTypeMemberWithDefaultValue2/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module AddAnnotationTypeMemberWithoutDefaultValue
End of request
digraph X {
AddAnnotationTypeMemberWithoutDefaultValue[label="AddAnnotationTypeMemberWithoutDefaultValue"];
}
digraph X {
AddAnnotationTypeMemberWithoutDefaultValue[label="AddAnnotationTypeMemberWithoutDefaultValue"];
}
Propagated modules:
module AddAnnotationTypeMemberWithoutDefaultValue
End of propagated
Cleaning output files:
out/production/AddAnnotationTypeMemberWithoutDefaultValue/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module AddDefaultToAnnotationMember
End of request
digraph X {
AddDefaultToAnnotationMember[label="AddDefaultToAnnotationMember"];
}
digraph X {
AddDefaultToAnnotationMember[label="AddDefaultToAnnotationMember"];
}
Propagated modules:
module AddDefaultToAnnotationMember
End of propagated
Cleaning output files:
out/production/AddDefaultToAnnotationMember/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ChangeAnnotationRetentionPolicy
End of request
digraph X {
ChangeAnnotationRetentionPolicy[label="ChangeAnnotationRetentionPolicy"];
}
digraph X {
ChangeAnnotationRetentionPolicy[label="ChangeAnnotationRetentionPolicy"];
}
Propagated modules:
module ChangeAnnotationRetentionPolicy
End of propagated
Cleaning output files:
out/production/ChangeAnnotationRetentionPolicy/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ChangeAnnotationRetentionPolicy1
End of request
digraph X {
ChangeAnnotationRetentionPolicy1[label="ChangeAnnotationRetentionPolicy1"];
}
digraph X {
ChangeAnnotationRetentionPolicy1[label="ChangeAnnotationRetentionPolicy1"];
}
Propagated modules:
module ChangeAnnotationRetentionPolicy1
End of propagated
Cleaning output files:
out/production/ChangeAnnotationRetentionPolicy1/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ChangeAnnotationRetentionPolicy2
End of request
digraph X {
ChangeAnnotationRetentionPolicy2[label="ChangeAnnotationRetentionPolicy2"];
}
digraph X {
ChangeAnnotationRetentionPolicy2[label="ChangeAnnotationRetentionPolicy2"];
}
Propagated modules:
module ChangeAnnotationRetentionPolicy2
End of propagated
Cleaning output files:
out/production/ChangeAnnotationRetentionPolicy2/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ChangeAnnotationRetentionPolicy3
End of request
digraph X {
ChangeAnnotationRetentionPolicy3[label="ChangeAnnotationRetentionPolicy3"];
}
digraph X {
ChangeAnnotationRetentionPolicy3[label="ChangeAnnotationRetentionPolicy3"];
}
Propagated modules:
module ChangeAnnotationRetentionPolicy3
End of propagated
Cleaning output files:
out/production/ChangeAnnotationRetentionPolicy3/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ChangeAnnotationRetentionPolicy4
End of request
digraph X {
ChangeAnnotationRetentionPolicy4[label="ChangeAnnotationRetentionPolicy4"];
}
digraph X {
ChangeAnnotationRetentionPolicy4[label="ChangeAnnotationRetentionPolicy4"];
}
Propagated modules:
module ChangeAnnotationRetentionPolicy4
End of propagated
Cleaning output files:
out/production/ChangeAnnotationRetentionPolicy4/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ChangeAnnotationTypeMemberType
End of request
digraph X {
ChangeAnnotationTypeMemberType[label="ChangeAnnotationTypeMemberType"];
}
digraph X {
ChangeAnnotationTypeMemberType[label="ChangeAnnotationTypeMemberType"];
}
Propagated modules:
module ChangeAnnotationTypeMemberType
End of propagated
Cleaning output files:
out/production/ChangeAnnotationTypeMemberType/A.class
End of files
@@ -1,34 +1,3 @@
Request to make modules:
module a1
module a2
module b21
module b22
module conservativeNonIncremental
End of request
digraph X {
a1[label="a1"];
conservativeNonIncremental -> a1;
a2[label="a2"];
conservativeNonIncremental -> a2;
b21[label="b21"];
a2 -> b21;
b22[label="b22"];
a2 -> b22;
conservativeNonIncremental[label="conservativeNonIncremental"];
}
digraph X {
a1[label="a1"];
conservativeNonIncremental -> a1;
conservativeNonIncremental[label="conservativeNonIncremental"];
a2[label="a2"];
b21[label="b21"];
b22[label="b22"];
}
Propagated modules:
module a2
module b21
module b22
End of propagated
Cleaning output files:
out/production/a2/A2.class
End of files
@@ -1,34 +1,3 @@
Request to make modules:
module a1
module a2
module b21
module b22
module conservativeNonIncremental
End of request
digraph X {
a1[label="a1"];
conservativeNonIncremental -> a1;
a2[label="a2"];
conservativeNonIncremental -> a2;
b21[label="b21"];
a2 -> b21;
b22[label="b22"];
a2 -> b22;
conservativeNonIncremental[label="conservativeNonIncremental"];
}
digraph X {
a1[label="a1"];
conservativeNonIncremental -> a1;
conservativeNonIncremental[label="conservativeNonIncremental"];
a2[label="a2"];
b21[label="b21"];
b22[label="b22"];
}
Propagated modules:
module a2
module b21
module b22
End of propagated
Cleaning output files:
out/production/a2/A2.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module MetaAnnotationChanged
End of request
digraph X {
MetaAnnotationChanged[label="MetaAnnotationChanged"];
}
digraph X {
MetaAnnotationChanged[label="MetaAnnotationChanged"];
}
Propagated modules:
module MetaAnnotationChanged
End of propagated
Cleaning output files:
out/production/MetaAnnotationChanged/A1.class
out/production/MetaAnnotationChanged/C1.class
@@ -1,15 +1,3 @@
Request to make modules:
module MetaAnnotationChangedCascade
End of request
digraph X {
MetaAnnotationChangedCascade[label="MetaAnnotationChangedCascade"];
}
digraph X {
MetaAnnotationChangedCascade[label="MetaAnnotationChangedCascade"];
}
Propagated modules:
module MetaAnnotationChangedCascade
End of propagated
Cleaning output files:
out/production/MetaAnnotationChangedCascade/A.class
out/production/MetaAnnotationChangedCascade/C.class
@@ -1,15 +1,3 @@
Request to make modules:
module MetaAnnotationChangedCascade2
End of request
digraph X {
MetaAnnotationChangedCascade2[label="MetaAnnotationChangedCascade2"];
}
digraph X {
MetaAnnotationChangedCascade2[label="MetaAnnotationChangedCascade2"];
}
Propagated modules:
module MetaAnnotationChangedCascade2
End of propagated
Cleaning output files:
out/production/MetaAnnotationChangedCascade2/A.class
out/production/MetaAnnotationChangedCascade2/C.class
@@ -1,15 +1,3 @@
Request to make modules:
module RemoveAnnotationTarget
End of request
digraph X {
RemoveAnnotationTarget[label="RemoveAnnotationTarget"];
}
digraph X {
RemoveAnnotationTarget[label="RemoveAnnotationTarget"];
}
Propagated modules:
module RemoveAnnotationTarget
End of propagated
Cleaning output files:
out/production/RemoveAnnotationTarget/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module RemoveAnnotationTypeMember
End of request
digraph X {
RemoveAnnotationTypeMember[label="RemoveAnnotationTypeMember"];
}
digraph X {
RemoveAnnotationTypeMember[label="RemoveAnnotationTypeMember"];
}
Propagated modules:
module RemoveAnnotationTypeMember
End of propagated
Cleaning output files:
out/production/RemoveAnnotationTypeMember/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module RemoveAnnotationTypeMember1
End of request
digraph X {
RemoveAnnotationTypeMember1[label="RemoveAnnotationTypeMember1"];
}
digraph X {
RemoveAnnotationTypeMember1[label="RemoveAnnotationTypeMember1"];
}
Propagated modules:
module RemoveAnnotationTypeMember1
End of propagated
Cleaning output files:
out/production/RemoveAnnotationTypeMember1/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module RemoveDefaultFromAnnotationMember
End of request
digraph X {
RemoveDefaultFromAnnotationMember[label="RemoveDefaultFromAnnotationMember"];
}
digraph X {
RemoveDefaultFromAnnotationMember[label="RemoveDefaultFromAnnotationMember"];
}
Propagated modules:
module RemoveDefaultFromAnnotationMember
End of propagated
Cleaning output files:
out/production/RemoveDefaultFromAnnotationMember/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ChangeClassName
End of request
digraph X {
ChangeClassName[label="ChangeClassName"];
}
digraph X {
ChangeClassName[label="ChangeClassName"];
}
Propagated modules:
module ChangeClassName
End of propagated
Cleaning output files:
out/production/ChangeClassName/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module AddStatic
End of request
digraph X {
AddStatic[label="AddStatic"];
}
digraph X {
AddStatic[label="AddStatic"];
}
Propagated modules:
module AddStatic
End of propagated
Cleaning output files:
out/production/AddStatic/A$B.class
out/production/AddStatic/A.class
@@ -1,15 +1,3 @@
Request to make modules:
module DecAccess
End of request
digraph X {
DecAccess[label="DecAccess"];
}
digraph X {
DecAccess[label="DecAccess"];
}
Propagated modules:
module DecAccess
End of propagated
Cleaning output files:
out/production/DecAccess/impl/Service.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module dropAbstract
End of request
digraph X {
dropAbstract[label="dropAbstract"];
}
digraph X {
dropAbstract[label="dropAbstract"];
}
Propagated modules:
module dropAbstract
End of propagated
Cleaning output files:
out/production/dropAbstract/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module RemoveStatic
End of request
digraph X {
RemoveStatic[label="RemoveStatic"];
}
digraph X {
RemoveStatic[label="RemoveStatic"];
}
Propagated modules:
module RemoveStatic
End of propagated
Cleaning output files:
out/production/RemoveStatic/A$B.class
out/production/RemoveStatic/A.class
@@ -1,15 +1,3 @@
Request to make modules:
module SetAbstract
End of request
digraph X {
SetAbstract[label="SetAbstract"];
}
digraph X {
SetAbstract[label="SetAbstract"];
}
Propagated modules:
module SetAbstract
End of propagated
Cleaning output files:
out/production/SetAbstract/Service.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module SetFinal
End of request
digraph X {
SetFinal[label="SetFinal"];
}
digraph X {
SetFinal[label="SetFinal"];
}
Propagated modules:
module SetFinal
End of propagated
Cleaning output files:
out/production/SetFinal/Service.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module SetFinal1
End of request
digraph X {
SetFinal1[label="SetFinal1"];
}
digraph X {
SetFinal1[label="SetFinal1"];
}
Propagated modules:
module SetFinal1
End of propagated
Cleaning output files:
out/production/SetFinal1/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module AddExtends
End of request
digraph X {
AddExtends[label="AddExtends"];
}
digraph X {
AddExtends[label="AddExtends"];
}
Propagated modules:
module AddExtends
End of propagated
Cleaning output files:
out/production/AddExtends/Super.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module AddImplements
End of request
digraph X {
AddImplements[label="AddImplements"];
}
digraph X {
AddImplements[label="AddImplements"];
}
Propagated modules:
module AddImplements
End of propagated
Cleaning output files:
out/production/AddImplements/Super.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ChangeExtends
End of request
digraph X {
ChangeExtends[label="ChangeExtends"];
}
digraph X {
ChangeExtends[label="ChangeExtends"];
}
Propagated modules:
module ChangeExtends
End of propagated
Cleaning output files:
out/production/ChangeExtends/Super.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module RemoveExtends
End of request
digraph X {
RemoveExtends[label="RemoveExtends"];
}
digraph X {
RemoveExtends[label="RemoveExtends"];
}
Propagated modules:
module RemoveExtends
End of propagated
Cleaning output files:
out/production/RemoveExtends/Super.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module RemoveImplements
End of request
digraph X {
RemoveImplements[label="RemoveImplements"];
}
digraph X {
RemoveImplements[label="RemoveImplements"];
}
Propagated modules:
module RemoveImplements
End of propagated
Cleaning output files:
out/production/RemoveImplements/Super.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module RemoveImplements2
End of request
digraph X {
RemoveImplements2[label="RemoveImplements2"];
}
digraph X {
RemoveImplements2[label="RemoveImplements2"];
}
Propagated modules:
module RemoveImplements2
End of propagated
Cleaning output files:
out/production/RemoveImplements2/Test.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module RemoveImplements3
End of request
digraph X {
RemoveImplements3[label="RemoveImplements3"];
}
digraph X {
RemoveImplements3[label="RemoveImplements3"];
}
Propagated modules:
module RemoveImplements3
End of propagated
Cleaning output files:
out/production/RemoveImplements3/Test.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module Anonymous
End of request
digraph X {
Anonymous[label="Anonymous"];
}
digraph X {
Anonymous[label="Anonymous"];
}
Propagated modules:
module Anonymous
End of propagated
Cleaning output files:
out/production/Anonymous/Server.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ChangeDefinitionToClass
End of request
digraph X {
ChangeDefinitionToClass[label="ChangeDefinitionToClass"];
}
digraph X {
ChangeDefinitionToClass[label="ChangeDefinitionToClass"];
}
Propagated modules:
module ChangeDefinitionToClass
End of propagated
Cleaning output files:
out/production/ChangeDefinitionToClass/Server.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ChangeDefinitionToClass2
End of request
digraph X {
ChangeDefinitionToClass2[label="ChangeDefinitionToClass2"];
}
digraph X {
ChangeDefinitionToClass2[label="ChangeDefinitionToClass2"];
}
Propagated modules:
module ChangeDefinitionToClass2
End of propagated
Cleaning output files:
out/production/ChangeDefinitionToClass2/Server.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module DeleteClass
End of request
digraph X {
DeleteClass[label="DeleteClass"];
}
digraph X {
DeleteClass[label="DeleteClass"];
}
Propagated modules:
module DeleteClass
End of propagated
Cleaning output files:
out/production/DeleteClass/packageA/Server.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module DeleteClass1
End of request
digraph X {
DeleteClass1[label="DeleteClass1"];
}
digraph X {
DeleteClass1[label="DeleteClass1"];
}
Propagated modules:
module DeleteClass1
End of propagated
Cleaning output files:
out/production/DeleteClass1/packageA/Server.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module DeleteClass2
End of request
digraph X {
DeleteClass2[label="DeleteClass2"];
}
digraph X {
DeleteClass2[label="DeleteClass2"];
}
Propagated modules:
module DeleteClass2
End of propagated
Cleaning output files:
out/production/DeleteClass2/packageA/Server.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module DeleteClassPackageDoesntMatchRoot
End of request
digraph X {
DeleteClassPackageDoesntMatchRoot[label="DeleteClassPackageDoesntMatchRoot"];
}
digraph X {
DeleteClassPackageDoesntMatchRoot[label="DeleteClassPackageDoesntMatchRoot"];
}
Propagated modules:
module DeleteClassPackageDoesntMatchRoot
End of propagated
Cleaning output files:
out/production/DeleteClassPackageDoesntMatchRoot/ppp/Server$1.class
out/production/DeleteClassPackageDoesntMatchRoot/ppp/Server.class
@@ -1,15 +1,3 @@
Request to make modules:
module DependencyUpdate
End of request
digraph X {
DependencyUpdate[label="DependencyUpdate"];
}
digraph X {
DependencyUpdate[label="DependencyUpdate"];
}
Propagated modules:
module DependencyUpdate
End of propagated
Cleaning output files:
out/production/DependencyUpdate/A.class
out/production/DependencyUpdate/E.class
-12
View File
@@ -1,15 +1,3 @@
Request to make modules:
module Inner
End of request
digraph X {
Inner[label="Inner"];
}
digraph X {
Inner[label="Inner"];
}
Propagated modules:
module Inner
End of propagated
Cleaning output files:
out/production/Inner/Server.class
End of files
@@ -1,11 +0,0 @@
Request to make modules:
module NoResourceDelete
End of request
digraph X {
NoResourceDelete[label="NoResourceDelete"];
}
digraph X {
NoResourceDelete[label="NoResourceDelete"];
}
Propagated modules:
End of propagated
@@ -1,15 +1,3 @@
Request to make modules:
module NoSecondFileCompile
End of request
digraph X {
NoSecondFileCompile[label="NoSecondFileCompile"];
}
digraph X {
NoSecondFileCompile[label="NoSecondFileCompile"];
}
Propagated modules:
module NoSecondFileCompile
End of propagated
Cleaning output files:
out/production/NoSecondFileCompile/A.class
out/production/NoSecondFileCompile/B.class
@@ -1,15 +1,3 @@
Request to make modules:
module NoSecondFileCompile1
End of request
digraph X {
NoSecondFileCompile1[label="NoSecondFileCompile1"];
}
digraph X {
NoSecondFileCompile1[label="NoSecondFileCompile1"];
}
Propagated modules:
module NoSecondFileCompile1
End of propagated
Cleaning output files:
out/production/NoSecondFileCompile1/A.class
out/production/NoSecondFileCompile1/B.class
@@ -1,15 +1,3 @@
Request to make modules:
module SetFinal
End of request
digraph X {
SetFinal[label="SetFinal"];
}
digraph X {
SetFinal[label="SetFinal"];
}
Propagated modules:
module SetFinal
End of propagated
Cleaning output files:
out/production/SetFinal/Base.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module SetPrivate
End of request
digraph X {
SetPrivate[label="SetPrivate"];
}
digraph X {
SetPrivate[label="SetPrivate"];
}
Propagated modules:
module SetPrivate
End of propagated
Cleaning output files:
out/production/SetPrivate/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module SetProtected
End of request
digraph X {
SetProtected[label="SetProtected"];
}
digraph X {
SetProtected[label="SetProtected"];
}
Propagated modules:
module SetProtected
End of propagated
Cleaning output files:
out/production/SetProtected/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module SetStatic
End of request
digraph X {
SetStatic[label="SetStatic"];
}
digraph X {
SetStatic[label="SetStatic"];
}
Propagated modules:
module SetStatic
End of propagated
Cleaning output files:
out/production/SetStatic/Base.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module UnsetStatic
End of request
digraph X {
UnsetStatic[label="UnsetStatic"];
}
digraph X {
UnsetStatic[label="UnsetStatic"];
}
Propagated modules:
module UnsetStatic
End of propagated
Cleaning output files:
out/production/UnsetStatic/Base.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module UnsetStaticFinal
End of request
digraph X {
UnsetStaticFinal[label="UnsetStaticFinal"];
}
digraph X {
UnsetStaticFinal[label="UnsetStaticFinal"];
}
Propagated modules:
module UnsetStaticFinal
End of propagated
Cleaning output files:
out/production/UnsetStaticFinal/Server.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ConstantChain
End of request
digraph X {
ConstantChain[label="ConstantChain"];
}
digraph X {
ConstantChain[label="ConstantChain"];
}
Propagated modules:
module ConstantChain
End of propagated
Cleaning output files:
out/production/ConstantChain/Server.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ConstantChain1
End of request
digraph X {
ConstantChain1[label="ConstantChain1"];
}
digraph X {
ConstantChain1[label="ConstantChain1"];
}
Propagated modules:
module ConstantChain1
End of propagated
Cleaning output files:
out/production/ConstantChain1/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ConstantChain2
End of request
digraph X {
ConstantChain2[label="ConstantChain2"];
}
digraph X {
ConstantChain2[label="ConstantChain2"];
}
Propagated modules:
module ConstantChain2
End of propagated
Cleaning output files:
out/production/ConstantChain2/Client.class
out/production/ConstantChain2/Const1.class
@@ -1,15 +1,3 @@
Request to make modules:
module ConstantRemove
End of request
digraph X {
ConstantRemove[label="ConstantRemove"];
}
digraph X {
ConstantRemove[label="ConstantRemove"];
}
Propagated modules:
module ConstantRemove
End of propagated
Cleaning output files:
out/production/ConstantRemove/Server.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ConstantRemove1
End of request
digraph X {
ConstantRemove1[label="ConstantRemove1"];
}
digraph X {
ConstantRemove1[label="ConstantRemove1"];
}
Propagated modules:
module ConstantRemove1
End of propagated
Cleaning output files:
out/production/ConstantRemove1/Server.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module DoubleConstantChange
End of request
digraph X {
DoubleConstantChange[label="DoubleConstantChange"];
}
digraph X {
DoubleConstantChange[label="DoubleConstantChange"];
}
Propagated modules:
module DoubleConstantChange
End of propagated
Cleaning output files:
out/production/DoubleConstantChange/Server.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module FloatConstantChange
End of request
digraph X {
FloatConstantChange[label="FloatConstantChange"];
}
digraph X {
FloatConstantChange[label="FloatConstantChange"];
}
Propagated modules:
module FloatConstantChange
End of propagated
Cleaning output files:
out/production/FloatConstantChange/Server.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module InnerConstantChange
End of request
digraph X {
InnerConstantChange[label="InnerConstantChange"];
}
digraph X {
InnerConstantChange[label="InnerConstantChange"];
}
Propagated modules:
module InnerConstantChange
End of propagated
Cleaning output files:
out/production/InnerConstantChange/Server$Inner.class
out/production/InnerConstantChange/Server.class
@@ -1,15 +1,3 @@
Request to make modules:
module IntConstantChange
End of request
digraph X {
IntConstantChange[label="IntConstantChange"];
}
digraph X {
IntConstantChange[label="IntConstantChange"];
}
Propagated modules:
module IntConstantChange
End of propagated
Cleaning output files:
out/production/IntConstantChange/Server.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module LongConstantChange
End of request
digraph X {
LongConstantChange[label="LongConstantChange"];
}
digraph X {
LongConstantChange[label="LongConstantChange"];
}
Propagated modules:
module LongConstantChange
End of propagated
Cleaning output files:
out/production/LongConstantChange/Server.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module NonCompileTimeConstant
End of request
digraph X {
NonCompileTimeConstant[label="NonCompileTimeConstant"];
}
digraph X {
NonCompileTimeConstant[label="NonCompileTimeConstant"];
}
Propagated modules:
module NonCompileTimeConstant
End of propagated
Cleaning output files:
out/production/NonCompileTimeConstant/Test.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module nonIncremental1
End of request
digraph X {
nonIncremental1[label="nonIncremental1"];
}
digraph X {
nonIncremental1[label="nonIncremental1"];
}
Propagated modules:
module nonIncremental1
End of propagated
Cleaning output files:
out/production/nonIncremental1/A/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module NonIncremental2
End of request
digraph X {
NonIncremental2[label="NonIncremental2"];
}
digraph X {
NonIncremental2[label="NonIncremental2"];
}
Propagated modules:
module NonIncremental2
End of propagated
Cleaning output files:
out/production/NonIncremental2/A/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module StringConstantChange
End of request
digraph X {
StringConstantChange[label="StringConstantChange"];
}
digraph X {
StringConstantChange[label="StringConstantChange"];
}
Propagated modules:
module StringConstantChange
End of propagated
Cleaning output files:
out/production/StringConstantChange/Server.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module StringConstantLessAccessible
End of request
digraph X {
StringConstantLessAccessible[label="StringConstantLessAccessible"];
}
digraph X {
StringConstantLessAccessible[label="StringConstantLessAccessible"];
}
Propagated modules:
module StringConstantLessAccessible
End of propagated
Cleaning output files:
out/production/StringConstantLessAccessible/Server.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module TypeChange
End of request
digraph X {
TypeChange[label="TypeChange"];
}
digraph X {
TypeChange[label="TypeChange"];
}
Propagated modules:
module TypeChange
End of propagated
Cleaning output files:
out/production/TypeChange/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module TypeChange1
End of request
digraph X {
TypeChange1[label="TypeChange1"];
}
digraph X {
TypeChange1[label="TypeChange1"];
}
Propagated modules:
module TypeChange1
End of propagated
Cleaning output files:
out/production/TypeChange1/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module TypeChange2
End of request
digraph X {
TypeChange2[label="TypeChange2"];
}
digraph X {
TypeChange2[label="TypeChange2"];
}
Propagated modules:
module TypeChange2
End of propagated
Cleaning output files:
out/production/TypeChange2/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module AddMethodToBase
End of request
digraph X {
AddMethodToBase[label="AddMethodToBase"];
}
digraph X {
AddMethodToBase[label="AddMethodToBase"];
}
Propagated modules:
module AddMethodToBase
End of propagated
Cleaning output files:
out/production/AddMethodToBase/C.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module AddParameterizedMethodToBase
End of request
digraph X {
AddParameterizedMethodToBase[label="AddParameterizedMethodToBase"];
}
digraph X {
AddParameterizedMethodToBase[label="AddParameterizedMethodToBase"];
}
Propagated modules:
module AddParameterizedMethodToBase
End of propagated
Cleaning output files:
out/production/AddParameterizedMethodToBase/C.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ChangeBound
End of request
digraph X {
ChangeBound[label="ChangeBound"];
}
digraph X {
ChangeBound[label="ChangeBound"];
}
Propagated modules:
module ChangeBound
End of propagated
Cleaning output files:
out/production/ChangeBound/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ChangeBound1
End of request
digraph X {
ChangeBound1[label="ChangeBound1"];
}
digraph X {
ChangeBound1[label="ChangeBound1"];
}
Propagated modules:
module ChangeBound1
End of propagated
Cleaning output files:
out/production/ChangeBound1/A.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ChangeBoundClass1
End of request
digraph X {
ChangeBoundClass1[label="ChangeBoundClass1"];
}
digraph X {
ChangeBoundClass1[label="ChangeBoundClass1"];
}
Propagated modules:
module ChangeBoundClass1
End of propagated
Cleaning output files:
out/production/ChangeBoundClass1/Value.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ChangeBoundInterface1
End of request
digraph X {
ChangeBoundInterface1[label="ChangeBoundInterface1"];
}
digraph X {
ChangeBoundInterface1[label="ChangeBoundInterface1"];
}
Propagated modules:
module ChangeBoundInterface1
End of propagated
Cleaning output files:
out/production/ChangeBoundInterface1/I.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ChangeBoundedClass
End of request
digraph X {
ChangeBoundedClass[label="ChangeBoundedClass"];
}
digraph X {
ChangeBoundedClass[label="ChangeBoundedClass"];
}
Propagated modules:
module ChangeBoundedClass
End of propagated
Cleaning output files:
out/production/ChangeBoundedClass/Value.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ChangeExtends
End of request
digraph X {
ChangeExtends[label="ChangeExtends"];
}
digraph X {
ChangeExtends[label="ChangeExtends"];
}
Propagated modules:
module ChangeExtends
End of propagated
Cleaning output files:
out/production/ChangeExtends/Super.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ChangeExtends1
End of request
digraph X {
ChangeExtends1[label="ChangeExtends1"];
}
digraph X {
ChangeExtends1[label="ChangeExtends1"];
}
Propagated modules:
module ChangeExtends1
End of propagated
Cleaning output files:
out/production/ChangeExtends1/Super.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ChangeExtends2
End of request
digraph X {
ChangeExtends2[label="ChangeExtends2"];
}
digraph X {
ChangeExtends2[label="ChangeExtends2"];
}
Propagated modules:
module ChangeExtends2
End of propagated
Cleaning output files:
out/production/ChangeExtends2/Super.class
End of files
@@ -1,15 +1,3 @@
Request to make modules:
module ChangeImplements
End of request
digraph X {
ChangeImplements[label="ChangeImplements"];
}
digraph X {
ChangeImplements[label="ChangeImplements"];
}
Propagated modules:
module ChangeImplements
End of propagated
Cleaning output files:
out/production/ChangeImplements/Super.class
End of files

Some files were not shown because too many files have changed in this diff Show More