From 4830f704720a3cc12defe03ab3abe951d8a3fe07 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Wed, 13 Mar 2019 15:52:36 +0100 Subject: [PATCH] GuiDesigner plugin: advertise *.form files as compilable file type; JPS: include indirectly affected files into the compilation scope (IDEA-208765) --- .../jps/incremental/CompileScope.java | 2 ++ .../jps/incremental/CompileScopeImpl.java | 36 +++++++++++++------ .../compiler/FormsBindingManager.java | 2 ++ .../ui-designer/resources/META-INF/plugin.xml | 1 + .../uiDesigner/make/FormTypeRegistrar.java | 17 +++++++++ 5 files changed, 47 insertions(+), 11 deletions(-) create mode 100644 plugins/ui-designer/src/com/intellij/uiDesigner/make/FormTypeRegistrar.java diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileScope.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileScope.java index 2ed8d312a8f4..01778b722176 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileScope.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileScope.java @@ -73,4 +73,6 @@ public abstract class CompileScope { * were changed since last compilation */ public abstract boolean isBuildIncrementally(@NotNull BuildTargetType targetType); + + public abstract void markIndirectlyAffected(BuildTarget target, @NotNull File file); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileScopeImpl.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileScopeImpl.java index ee71486fac16..698fc373e113 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileScopeImpl.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileScopeImpl.java @@ -24,10 +24,7 @@ import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType; import org.jetbrains.jps.model.module.JpsModule; import java.io.File; -import java.util.Collection; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * @author nik @@ -37,6 +34,7 @@ public class CompileScopeImpl extends CompileScope { private final Collection> myTypesToForceBuild; private final Collection> myTargets; private final Map, Set> myFiles; + private final Map, Set> myIndirectlyAffectedFiles = Collections.synchronizedMap(new HashMap<>()); public CompileScopeImpl(Collection> types, Collection> typesToForceBuild, @@ -62,7 +60,7 @@ public class CompileScopeImpl extends CompileScope { @Override public boolean isAffected(@NotNull BuildTarget target) { - return isWholeTargetAffected(target) || myFiles.containsKey(target); + return isWholeTargetAffected(target) || myFiles.containsKey(target) || myIndirectlyAffectedFiles.containsKey(target); } @Override @@ -92,14 +90,30 @@ public class CompileScopeImpl extends CompileScope { @Override public boolean isAffected(BuildTarget target, @NotNull File file) { - if (myFiles.isEmpty()) {//optimization - return isWholeTargetAffected(target); - } - final Set files = myFiles.get(target); + final Set files = myFiles.isEmpty()? null : myFiles.get(target); if (files == null) { - return isWholeTargetAffected(target); + return isWholeTargetAffected(target) || isIndirectlyAffected(target, file); + } + return files.contains(file) || isIndirectlyAffected(target, file); + } + + private boolean isIndirectlyAffected(BuildTarget target, @NotNull File file) { + synchronized (myIndirectlyAffectedFiles) { + final Set indirect = myIndirectlyAffectedFiles.get(target); + return indirect != null && indirect.contains(file); + } + } + + @Override + public void markIndirectlyAffected(BuildTarget target, @NotNull File file) { + synchronized (myIndirectlyAffectedFiles) { + Set files = myIndirectlyAffectedFiles.get(target); + if (files == null) { + files = new HashSet<>(); + myIndirectlyAffectedFiles.put(target, files); + } + files.add(file); } - return files.contains(file); } private boolean isAffectedByAssociatedModule(BuildTarget target) { diff --git a/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/compiler/FormsBindingManager.java b/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/compiler/FormsBindingManager.java index 3a25334f9d71..9e8b25dd67f4 100644 --- a/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/compiler/FormsBindingManager.java +++ b/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/compiler/FormsBindingManager.java @@ -127,6 +127,7 @@ public class FormsBindingManager extends FormsBuilder { if (!excludes.isExcluded(boundSource)) { addBinding(boundSource, form, srcToForms); FSOperations.markDirty(context, CompilationRound.CURRENT, boundSource); + context.getScope().markIndirectlyAffected(target, boundSource); filesToCompile.put(boundSource, target); exitCode = ExitCode.OK; } @@ -145,6 +146,7 @@ public class FormsBindingManager extends FormsBuilder { if (!excludes.isExcluded(formFile) && formFile.exists()) { addBinding(srcFile, formFile, srcToForms); FSOperations.markDirty(context, CompilationRound.CURRENT, formFile); + context.getScope().markIndirectlyAffected(target, formFile); formsToCompile.put(formFile, target); exitCode = ExitCode.OK; } diff --git a/plugins/ui-designer/resources/META-INF/plugin.xml b/plugins/ui-designer/resources/META-INF/plugin.xml index 7569497258bb..4ba42105d1f6 100644 --- a/plugins/ui-designer/resources/META-INF/plugin.xml +++ b/plugins/ui-designer/resources/META-INF/plugin.xml @@ -136,6 +136,7 @@ + diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/make/FormTypeRegistrar.java b/plugins/ui-designer/src/com/intellij/uiDesigner/make/FormTypeRegistrar.java new file mode 100644 index 000000000000..52b34dc806c8 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/make/FormTypeRegistrar.java @@ -0,0 +1,17 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.uiDesigner.make; + +import com.intellij.openapi.compiler.CompilerManager; +import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.project.DumbAware; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.startup.StartupActivity; +import org.jetbrains.annotations.NotNull; + +public class FormTypeRegistrar implements StartupActivity, DumbAware { + + @Override + public void runActivity(@NotNull Project project) { + CompilerManager.getInstance(project).addCompilableFileType(StdFileTypes.GUI_DESIGNER_FORM); + } +} \ No newline at end of file