GuiDesigner plugin: advertise *.form files as compilable file type;

JPS: include indirectly affected files into the compilation scope (IDEA-208765)
This commit is contained in:
Eugene Zhuravlev
2019-03-13 15:54:27 +01:00
parent 2e490cee9e
commit 4830f70472
5 changed files with 47 additions and 11 deletions
@@ -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);
}
@@ -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<BuildTargetType<?>> myTypesToForceBuild;
private final Collection<BuildTarget<?>> myTargets;
private final Map<BuildTarget<?>, Set<File>> myFiles;
private final Map<BuildTarget<?>, Set<File>> myIndirectlyAffectedFiles = Collections.synchronizedMap(new HashMap<>());
public CompileScopeImpl(Collection<? extends BuildTargetType<?>> types,
Collection<? extends BuildTargetType<?>> 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<File> files = myFiles.get(target);
final Set<File> 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<File> indirect = myIndirectlyAffectedFiles.get(target);
return indirect != null && indirect.contains(file);
}
}
@Override
public void markIndirectlyAffected(BuildTarget<?> target, @NotNull File file) {
synchronized (myIndirectlyAffectedFiles) {
Set<File> 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) {
@@ -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;
}
@@ -136,6 +136,7 @@
<compiler implementation="com.intellij.uiDesigner.make.Form2SourceCompiler"/>
<compileServer.plugin classpath="jps/ui-designer-jps-plugin.jar"/>
<postStartupActivity implementation="com.intellij.uiDesigner.make.FormTypeRegistrar" />
<psi.referenceContributor language="TEXT" implementation="com.intellij.uiDesigner.binding.FormReferenceContributor"/>
@@ -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);
}
}