mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
@@ -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) {
|
||||
|
||||
+2
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user