diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/java/FilteredResourceRootDescriptor.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/FilteredResourceRootDescriptor.java index 65b9e1114d5a..5c8e201b274e 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/builders/java/FilteredResourceRootDescriptor.java +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/FilteredResourceRootDescriptor.java @@ -39,7 +39,7 @@ public final class FilteredResourceRootDescriptor extends ResourceRootDescriptor @Override public FileFilter createFileFilter() { final JpsProject project = getTarget().getModule().getProject(); - final JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(project); + final JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getCompilerConfiguration(project); final JpsCompilerExcludes excludes = configuration.getCompilerExcludes(); return file -> !excludes.isExcluded(file) && configuration.isResourceFile(file, getRootFile()); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/java/JavaSourceRootDescriptor.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/JavaSourceRootDescriptor.java index 0ead7d29feaa..49f8c09bdaa4 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/builders/java/JavaSourceRootDescriptor.java +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/JavaSourceRootDescriptor.java @@ -92,7 +92,7 @@ public class JavaSourceRootDescriptor extends BuildRootDescriptor { @NotNull @Override public FileFilter createFileFilter() { - final JpsCompilerExcludes excludes = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(target.getModule().getProject()).getCompilerExcludes(); + final JpsCompilerExcludes excludes = JpsJavaExtensionService.getInstance().getCompilerConfiguration(target.getModule().getProject()).getCompilerExcludes(); final FileFilter baseFilter = BuilderRegistry.getInstance().getModuleBuilderFileFilter(); return file -> baseFilter.accept(file) && !excludes.isExcluded(file); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/java/ResourceRootDescriptor.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/ResourceRootDescriptor.java index a39c8a347285..0cad2cf614c7 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/builders/java/ResourceRootDescriptor.java +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/ResourceRootDescriptor.java @@ -69,7 +69,7 @@ public class ResourceRootDescriptor extends BuildRootDescriptor { @Override public FileFilter createFileFilter() { final JpsProject project = getTarget().getModule().getProject(); - final JpsCompilerExcludes excludes = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(project).getCompilerExcludes(); + final JpsCompilerExcludes excludes = JpsJavaExtensionService.getInstance().getCompilerConfiguration(project).getCompilerExcludes(); return file -> !excludes.isExcluded(file); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java index 2233af17672f..960314bcc7f3 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java @@ -543,7 +543,7 @@ public class IncProjectBuilder { final ProjectDescriptor projectDescriptor = context.getProjectDescriptor(); ProjectBuildException ex = null; try { - final JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(projectDescriptor.getProject()); + final JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getCompilerConfiguration(projectDescriptor.getProject()); final boolean shouldClear = configuration.isClearOutputDirectoryOnRebuild(); if (shouldClear) { clearOutputs(context); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java index 0ae784368a1e..382f1e920371 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java @@ -87,7 +87,7 @@ public final class ModuleBuildTarget extends JVMModuleBuildTarget roots = new ArrayList<>(); JavaSourceRootType type = isTests() ? JavaSourceRootType.TEST_SOURCE : JavaSourceRootType.SOURCE; Iterable excludedRootProviders = JpsServiceManager.getInstance().getExtensions(ExcludedJavaSourceRootProvider.class); - final JpsJavaCompilerConfiguration compilerConfig = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(myModule.getProject()); + final JpsJavaCompilerConfiguration compilerConfig = JpsJavaExtensionService.getInstance().getCompilerConfiguration(myModule.getProject()); roots_loop: for (JpsTypedModuleSourceRoot sourceRoot : myModule.getSourceRoots(type)) { @@ -214,7 +214,7 @@ public final class ModuleBuildTarget extends JVMModuleBuildTarget notNulls = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(pd.getProject()).getNotNullAnnotations(); + final List notNulls = JpsJavaExtensionService.getInstance().getCompilerConfiguration(pd.getProject()).getNotNullAnnotations(); if (NotNullVerifyingInstrumenter.processClassFile((FailSafeClassReader)reader, writer, ArrayUtilRt.toStringArray(notNulls))) { return new BinaryContent(writer.toByteArray()); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/AnnotationsExcludedJavaSourceRootProvider.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/AnnotationsExcludedJavaSourceRootProvider.java index ea7dad2aba02..2f97a2549f41 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/AnnotationsExcludedJavaSourceRootProvider.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/AnnotationsExcludedJavaSourceRootProvider.java @@ -34,7 +34,7 @@ import java.io.File; public class AnnotationsExcludedJavaSourceRootProvider extends ExcludedJavaSourceRootProvider{ @Override public boolean isExcludedFromCompilation(@NotNull JpsModule module, @NotNull JpsModuleSourceRoot root) { - final JpsJavaCompilerConfiguration compilerConfig = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(module.getProject()); + final JpsJavaCompilerConfiguration compilerConfig = JpsJavaExtensionService.getInstance().getCompilerConfiguration(module.getProject()); final ProcessorConfigProfile profile = compilerConfig.getAnnotationProcessingProfile(module); if (!profile.isEnabled()) { return false; diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java index 55fa954595c6..84ac06f4f4c3 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java @@ -55,8 +55,7 @@ import org.jetbrains.jps.model.serialization.PathMacroUtil; import org.jetbrains.jps.service.JpsServiceManager; import org.jetbrains.jps.service.SharedThreadPool; -import javax.tools.Diagnostic; -import javax.tools.JavaFileObject; +import javax.tools.*; import java.io.File; import java.io.FileFilter; import java.io.IOException; @@ -766,7 +765,7 @@ public class JavaBuilder extends ModuleLevelBuilder { final List compilationOptions = new ArrayList<>(); final List vmOptions = new ArrayList<>(); final JpsProject project = context.getProjectDescriptor().getProject(); - final JpsJavaCompilerOptions compilerOptions = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(project).getCurrentCompilerOptions(); + final JpsJavaCompilerOptions compilerOptions = JpsJavaExtensionService.getInstance().getCompilerConfiguration(project).getCurrentCompilerOptions(); if (compilerOptions.DEBUGGING_INFO) { compilationOptions.add("-g"); } @@ -939,7 +938,7 @@ public class JavaBuilder extends ModuleLevelBuilder { } private static void addCrossCompilationOptions(int compilerSdkVersion, List options, CompileContext context, ModuleChunk chunk) { - final JpsJavaCompilerConfiguration compilerConfiguration = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration( + final JpsJavaCompilerConfiguration compilerConfiguration = JpsJavaExtensionService.getInstance().getCompilerConfiguration( context.getProjectDescriptor().getProject() ); diff --git a/jps/jps-builders/testSrc/org/jetbrains/ether/Java9Test.java b/jps/jps-builders/testSrc/org/jetbrains/ether/Java9Test.java index 80bdcf4576dc..23f9571b1d61 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/ether/Java9Test.java +++ b/jps/jps-builders/testSrc/org/jetbrains/ether/Java9Test.java @@ -172,7 +172,7 @@ public class Java9Test extends IncrementalTestCase { public void testExplodedAutoModuleWithManifest() { setupInitialProject(); final Map modules = setupModules(); - JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(myProject).addResourcePattern("*.MF"); + JpsJavaExtensionService.getInstance().getCompilerConfiguration(myProject).addResourcePattern("*.MF"); assertEquals(2, modules.size()); assertTrue(modules.containsKey("A")); diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/resources/ResourceCopyingTest.java b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/resources/ResourceCopyingTest.java index 640b6a9a78d5..504e38ff92c8 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/resources/ResourceCopyingTest.java +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/resources/ResourceCopyingTest.java @@ -39,7 +39,7 @@ public class ResourceCopyingTest extends JpsBuildTestCase { @Override protected void setUp() throws Exception { super.setUp(); - JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(myProject).addResourcePattern("*.xml"); + JpsJavaExtensionService.getInstance().getCompilerConfiguration(myProject).addResourcePattern("*.xml"); } public void testSimple() { @@ -107,7 +107,7 @@ public class ResourceCopyingTest extends JpsBuildTestCase { String excludedFile = createFile("res/excluded.java", "XXX"); JpsModule m = addModule("m"); m.addSourceRoot(JpsPathUtil.pathToUrl(PathUtil.getParentPath(file)), JavaResourceRootType.RESOURCE); - JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(myProject).getCompilerExcludes().addExcludedFile( + JpsJavaExtensionService.getInstance().getCompilerConfiguration(myProject).getCompilerExcludes().addExcludedFile( "file://" + FileUtil.toSystemIndependentName(excludedFile) ); rebuildAllModules(); diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderTest.kt b/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderTest.kt index b3c28623b75e..e23a3b5a1d34 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderTest.kt +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderTest.kt @@ -223,7 +223,7 @@ class ArtifactBuilderTest : ArtifactBuilderTestCase() { fun testCopyResourcesFromModuleOutput() { val file = createFile("src/a.xml", "") - JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(myProject).addResourcePattern("*.xml") + JpsJavaExtensionService.getInstance().getCompilerConfiguration(myProject).addResourcePattern("*.xml") val module = addModule("a", PathUtil.getParentPath(file)) val artifact = addArtifact(root().module(module)) buildArtifacts(artifact) diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/CleanArtifactOutputOnRebuildTest.java b/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/CleanArtifactOutputOnRebuildTest.java index 3742f610855c..071e7c34c5ae 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/CleanArtifactOutputOnRebuildTest.java +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/CleanArtifactOutputOnRebuildTest.java @@ -40,7 +40,7 @@ public class CleanArtifactOutputOnRebuildTest extends ArtifactBuilderTestCase { } public void testDoNotCleanOnRebuildIfOptionIsSwitchedOff() { - JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(myProject).setClearOutputDirectoryOnRebuild(false); + JpsJavaExtensionService.getInstance().getCompilerConfiguration(myProject).setClearOutputDirectoryOnRebuild(false); JpsArtifact a = addArtifact(root().fileCopy(createFile("a.txt"))); buildArtifacts(a); createFileInArtifactOutput(a, "b.txt"); diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsElementContainer.java b/jps/model-api/src/org/jetbrains/jps/model/JpsElementContainer.java index 231a6473d486..c69cc70fe22a 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/JpsElementContainer.java +++ b/jps/model-api/src/org/jetbrains/jps/model/JpsElementContainer.java @@ -17,6 +17,8 @@ package org.jetbrains.jps.model; import org.jetbrains.annotations.NotNull; +import java.util.function.Supplier; + /** * @author nik */ @@ -36,6 +38,9 @@ public interface JpsElementContainer { &JpsElementParameterizedCreator> T setChild(@NotNull K role, @NotNull P param); + &JpsElementParameterizedCreator> + T getOrSetChild(@NotNull K role, @NotNull Supplier

param); + T setChild(JpsElementChildRole role, T child); diff --git a/jps/model-api/src/org/jetbrains/jps/model/ex/JpsElementContainerEx.java b/jps/model-api/src/org/jetbrains/jps/model/ex/JpsElementContainerEx.java index 79edd620632a..9da2fbdaf7df 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/ex/JpsElementContainerEx.java +++ b/jps/model-api/src/org/jetbrains/jps/model/ex/JpsElementContainerEx.java @@ -25,6 +25,8 @@ import java.util.Map; * @author nik */ public abstract class JpsElementContainerEx implements JpsElementContainer { + protected abstract Object getDataLock(); + protected abstract Map, JpsElement> getElementsMap(); protected abstract void applyChanges(JpsElementContainerEx modified); diff --git a/jps/model-api/src/org/jetbrains/jps/model/ex/JpsFactoryElementChildRoleBase.java b/jps/model-api/src/org/jetbrains/jps/model/ex/JpsFactoryElementChildRoleBase.java new file mode 100644 index 000000000000..fa61b0383c9c --- /dev/null +++ b/jps/model-api/src/org/jetbrains/jps/model/ex/JpsFactoryElementChildRoleBase.java @@ -0,0 +1,49 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.jps.model.ex; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.JpsElement; +import org.jetbrains.jps.model.JpsElementChildRole; +import org.jetbrains.jps.model.JpsElementCreator; + +/** + * @author nik + */ +public class JpsFactoryElementChildRoleBase extends JpsElementChildRole implements JpsElementCreator { + private final String myDebugName; + private final JpsElementCreator myFactoryImpl; + + protected JpsFactoryElementChildRoleBase(String debugName, JpsElementCreator factoryImpl) { + myDebugName = debugName; + myFactoryImpl = factoryImpl; + } + + @Override + public String toString() { + return myDebugName; + } + + @NotNull + @Override + public E create() { + return myFactoryImpl.create(); + } + + public static JpsFactoryElementChildRoleBase create(String debugName, JpsElementCreator factory) { + return new JpsFactoryElementChildRoleBase<>(debugName, factory); + } +} diff --git a/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaExtensionService.java b/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaExtensionService.java index 192f8d8b88dd..e3c17baf249d 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaExtensionService.java +++ b/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaExtensionService.java @@ -91,9 +91,13 @@ public abstract class JpsJavaExtensionService { public abstract JpsTypedLibrary> addJavaSdk(@NotNull JpsGlobal global, @NotNull String name, @NotNull String homePath); - @Nullable + @NotNull public abstract JpsJavaCompilerConfiguration getCompilerConfiguration(@NotNull JpsProject project); + /** + * @deprecated use {@link JpsJavaExtensionService#getCompilerConfiguration(JpsProject)} instead + */ + @Deprecated @NotNull public abstract JpsJavaCompilerConfiguration getOrCreateCompilerConfiguration(@NotNull JpsProject project); diff --git a/jps/model-impl/src/org/jetbrains/jps/model/ex/JpsElementContainerImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/ex/JpsElementContainerImpl.java index 35759f05a5b8..210e8f97dbe2 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/ex/JpsElementContainerImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/ex/JpsElementContainerImpl.java @@ -20,12 +20,16 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.*; +import java.util.ArrayList; +import java.util.Collection; import java.util.Map; +import java.util.function.Supplier; /** * @author nik */ public class JpsElementContainerImpl extends JpsElementContainerEx implements JpsElementContainer { + private final Object myDataLock = new Object(); private final Map, JpsElement> myElements = new THashMap<>(1); private final @NotNull JpsCompositeElementBase myParent; @@ -35,24 +39,27 @@ public class JpsElementContainerImpl extends JpsElementContainerEx implements Jp public JpsElementContainerImpl(@NotNull JpsElementContainerEx original, @NotNull JpsCompositeElementBase parent) { myParent = parent; - for (Map.Entry, JpsElement> entry : original.getElementsMap().entrySet()) { - final JpsElementChildRole role = entry.getKey(); - final JpsElement copy = entry.getValue().getBulkModificationSupport().createCopy(); - JpsElementBase.setParent(copy, myParent); - myElements.put(role, copy); + synchronized (original.getDataLock()) { + for (Map.Entry, JpsElement> entry : original.getElementsMap().entrySet()) { + final JpsElementChildRole role = entry.getKey(); + final JpsElement copy = entry.getValue().getBulkModificationSupport().createCopy(); + JpsElementBase.setParent(copy, myParent); + myElements.put(role, copy); + } } } @Override public T getChild(@NotNull JpsElementChildRole role) { - //noinspection unchecked - return (T)myElements.get(role); + synchronized (myDataLock) { + //noinspection unchecked + return (T)myElements.get(role); + } } @NotNull @Override - public & JpsElementParameterizedCreator> T setChild(@NotNull K role, - @NotNull P param) { + public & JpsElementParameterizedCreator> T setChild(@NotNull K role, @NotNull P param) { final T child = role.create(param); return setChild(role, child); } @@ -67,28 +74,75 @@ public class JpsElementContainerImpl extends JpsElementContainerEx implements Jp @NotNull @Override public & JpsElementCreator> T getOrSetChild(@NotNull K role) { - final T child = getChild(role); - if (child == null) { - return setChild(role); + T added = null; + try { + synchronized (myDataLock) { + final T cached = (T)myElements.get(role); + if (cached != null) { + return cached; + } + return added = putChild(role, role.create()); + } + } + finally { + if (added != null) { + fireChildSet(role, added); + } + } + } + + @Override + public & JpsElementParameterizedCreator> T getOrSetChild(@NotNull K role, @NotNull Supplier

param) { + T added = null; + try { + synchronized (myDataLock) { + final T cached = (T)myElements.get(role); + if (cached != null) { + return cached; + } + return added = putChild(role, role.create(param.get())); + } + } + finally { + if (added != null) { + fireChildSet(role, added); + } } - return child; } @Override public T setChild(JpsElementChildRole role, T child) { - myElements.put(role, child); + try { + synchronized (myDataLock) { + return putChild(role, child); + } + } + finally { + fireChildSet(role, child); + } + } + + @NotNull + private T putChild(JpsElementChildRole role, T child) { JpsElementBase.setParent(child, myParent); + myElements.put(role, child); + return child; + } + + private void fireChildSet(JpsElementChildRole role, T child) { final JpsEventDispatcher eventDispatcher = getEventDispatcher(); if (eventDispatcher != null) { eventDispatcher.fireElementAdded(child, role); } - return child; } @Override public void removeChild(@NotNull JpsElementChildRole role) { //noinspection unchecked - final T removed = (T)myElements.remove(role); + final T removed; + synchronized (myDataLock) { + removed = (T)myElements.remove(role); + } if (removed == null) return; final JpsEventDispatcher eventDispatcher = getEventDispatcher(); if (eventDispatcher != null) { @@ -98,19 +152,36 @@ public class JpsElementContainerImpl extends JpsElementContainerEx implements Jp } @Override - protected Map, JpsElement> getElementsMap() { + protected final Object getDataLock() { + return myDataLock; + } + + @Override + protected final Map, JpsElement> getElementsMap() { return myElements; } @Override public void applyChanges(@NotNull JpsElementContainerEx modified) { - for (JpsElementChildRole role : myElements.keySet()) { + final Collection> roles = new ArrayList<>(); + + synchronized (myDataLock) { + roles.addAll(myElements.keySet()); + } + for (JpsElementChildRole role : roles) { applyChanges(role, modified); } - for (JpsElementChildRole role : modified.getElementsMap().keySet()) { - if (!myElements.containsKey(role)) { - applyChanges(role, modified); - } + + roles.clear(); + synchronized (modified.getDataLock()) { + roles.addAll(modified.getElementsMap().keySet()); + } + synchronized (myDataLock) { + roles.removeAll(myElements.keySet()); + } + + for (JpsElementChildRole role : roles) { + applyChanges(role, modified); } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JavaModuleIndexRole.java b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JavaModuleIndexRole.java index d7924aa6cf99..d055cd4cd4cd 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JavaModuleIndexRole.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JavaModuleIndexRole.java @@ -13,7 +13,7 @@ import org.jetbrains.jps.model.java.compiler.JpsCompilerExcludes; public class JavaModuleIndexRole extends JpsElementChildRoleBase implements JpsElementParameterizedCreator{ public static final JavaModuleIndexRole INSTANCE = new JavaModuleIndexRole(); - public JavaModuleIndexRole() { + private JavaModuleIndexRole() { super("java module index"); } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaExtensionServiceImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaExtensionServiceImpl.java index aff6c299cf3e..dbdc4ff68301 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaExtensionServiceImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaExtensionServiceImpl.java @@ -7,7 +7,6 @@ import com.intellij.openapi.util.io.FileUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsDummyElement; -import org.jetbrains.jps.model.JpsElementContainer; import org.jetbrains.jps.model.JpsGlobal; import org.jetbrains.jps.model.JpsProject; import org.jetbrains.jps.model.java.*; @@ -142,20 +141,17 @@ public class JpsJavaExtensionServiceImpl extends JpsJavaExtensionService { return sdk; } - @Nullable + @NotNull @Override public JpsJavaCompilerConfiguration getCompilerConfiguration(@NotNull JpsProject project) { - return project.getContainer().getChild(JpsJavaCompilerConfigurationImpl.ROLE); + return project.getContainer().getOrSetChild(JpsJavaCompilerConfigurationImpl.ROLE); } + @Deprecated @NotNull @Override public JpsJavaCompilerConfiguration getOrCreateCompilerConfiguration(@NotNull JpsProject project) { - JpsJavaCompilerConfiguration configuration = getCompilerConfiguration(project); - if (configuration == null) { - configuration = project.getContainer().setChild(JpsJavaCompilerConfigurationImpl.ROLE, new JpsJavaCompilerConfigurationImpl()); - } - return configuration; + return getCompilerConfiguration(project); } @Nullable @@ -236,11 +232,6 @@ public class JpsJavaExtensionServiceImpl extends JpsJavaExtensionService { @NotNull @Override public JavaModuleIndex getJavaModuleIndex(@NotNull JpsProject project) { - JpsElementContainer container = project.getContainer(); - JavaModuleIndex index = container.getChild(JavaModuleIndexRole.INSTANCE); - if (index == null) { - index = container.setChild(JavaModuleIndexRole.INSTANCE, getOrCreateCompilerConfiguration(project).getCompilerExcludes()); - } - return index; + return project.getContainer().getOrSetChild(JavaModuleIndexRole.INSTANCE, () -> getCompilerConfiguration(project).getCompilerExcludes()); } } \ No newline at end of file diff --git a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/JpsJavaCompilerConfigurationImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/JpsJavaCompilerConfigurationImpl.java index 40dae8139813..c54cb9197311 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/JpsJavaCompilerConfigurationImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/JpsJavaCompilerConfigurationImpl.java @@ -17,9 +17,8 @@ package org.jetbrains.jps.model.java.impl.compiler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jps.model.JpsElementChildRole; import org.jetbrains.jps.model.ex.JpsCompositeElementBase; -import org.jetbrains.jps.model.ex.JpsElementChildRoleBase; +import org.jetbrains.jps.model.ex.JpsFactoryElementChildRoleBase; import org.jetbrains.jps.model.java.compiler.*; import org.jetbrains.jps.model.module.JpsModule; @@ -30,7 +29,7 @@ import java.util.*; * @author nik */ public class JpsJavaCompilerConfigurationImpl extends JpsCompositeElementBase implements JpsJavaCompilerConfiguration { - public static final JpsElementChildRole ROLE = JpsElementChildRoleBase.create("compiler configuration"); + public static final JpsFactoryElementChildRoleBase ROLE = JpsFactoryElementChildRoleBase.create("compiler configuration", () -> new JpsJavaCompilerConfigurationImpl()); private boolean myAddNotNullAssertions = true; private List myNotNullAnnotations = Collections.singletonList(NotNull.class.getName()); private boolean myClearOutputDirectoryOnRebuild = true; diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsCompilerValidationExcludeSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsCompilerValidationExcludeSerializer.java index 02ae860e97d2..82e3e25e7183 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsCompilerValidationExcludeSerializer.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsCompilerValidationExcludeSerializer.java @@ -35,7 +35,7 @@ public class JpsCompilerValidationExcludeSerializer extends JpsProjectExtensionS @Override public void loadExtension(@NotNull JpsProject project, @NotNull Element componentTag) { - JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(project); + JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getCompilerConfiguration(project); JpsJavaCompilerConfigurationSerializer.readExcludes(componentTag, configuration.getValidationExcludes()); } diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsEclipseCompilerOptionsSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsEclipseCompilerOptionsSerializer.java index 5fdf26094ab2..34309f66aa05 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsEclipseCompilerOptionsSerializer.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsEclipseCompilerOptionsSerializer.java @@ -37,14 +37,14 @@ public class JpsEclipseCompilerOptionsSerializer extends JpsProjectExtensionSeri @Override public void loadExtension(@NotNull JpsProject project, @NotNull Element componentTag) { - JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(project); + JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getCompilerConfiguration(project); EclipseCompilerOptions options = XmlSerializer.deserialize(componentTag, EclipseCompilerOptions.class); configuration.setCompilerOptions(myCompilerId, options); } @Override public void loadExtensionWithDefaultSettings(@NotNull JpsProject project) { - JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(project); + JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getCompilerConfiguration(project); configuration.setCompilerOptions(myCompilerId, new EclipseCompilerOptions()); } diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsJavaCompilerConfigurationSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsJavaCompilerConfigurationSerializer.java index 45d883d2b4af..a53849ee891d 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsJavaCompilerConfigurationSerializer.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsJavaCompilerConfigurationSerializer.java @@ -40,7 +40,7 @@ public class JpsJavaCompilerConfigurationSerializer extends JpsProjectExtensionS @Override public void loadExtension(@NotNull JpsProject project, @NotNull Element componentTag) { - JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(project); + JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getCompilerConfiguration(project); Element addNotNullTag = componentTag.getChild(ADD_NOTNULL_ASSERTIONS); if (addNotNullTag != null) { configuration.setAddNotNullAssertions(Boolean.parseBoolean(addNotNullTag.getAttributeValue(ENABLED, "true"))); @@ -101,7 +101,7 @@ public class JpsJavaCompilerConfigurationSerializer extends JpsProjectExtensionS @Override public void loadExtensionWithDefaultSettings(@NotNull JpsProject project) { - JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(project); + JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getCompilerConfiguration(project); for (String pattern : DEFAULT_WILDCARD_PATTERNS) { configuration.addResourcePattern(pattern); } diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsJavaCompilerNotNullableSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsJavaCompilerNotNullableSerializer.java index 42a6f060534d..85e3010686d9 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsJavaCompilerNotNullableSerializer.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsJavaCompilerNotNullableSerializer.java @@ -24,7 +24,7 @@ public class JpsJavaCompilerNotNullableSerializer extends JpsProjectExtensionSer @Override public void loadExtension(@NotNull JpsProject project, @NotNull Element componentTag) { - JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(project); + JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getCompilerConfiguration(project); List annoNames = new ArrayList<>(); for (Element option : componentTag.getChildren("instrumentedNotNulls")) { for (Element item : option.getChildren("option")) { @@ -39,7 +39,7 @@ public class JpsJavaCompilerNotNullableSerializer extends JpsProjectExtensionSer @Override public void loadExtensionWithDefaultSettings(@NotNull JpsProject project) { - JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(project).setNotNullAnnotations( + JpsJavaExtensionService.getInstance().getCompilerConfiguration(project).setNotNullAnnotations( Collections.singletonList(NotNull.class.getName())); } diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsJavaCompilerOptionsSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsJavaCompilerOptionsSerializer.java index f4355563acba..c9ea85c200bb 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsJavaCompilerOptionsSerializer.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsJavaCompilerOptionsSerializer.java @@ -37,14 +37,14 @@ public class JpsJavaCompilerOptionsSerializer extends JpsProjectExtensionSeriali @Override public void loadExtension(@NotNull JpsProject project, @NotNull Element componentTag) { - JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(project); + JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getCompilerConfiguration(project); JpsJavaCompilerOptions options = XmlSerializer.deserialize(componentTag, JpsJavaCompilerOptions.class); configuration.setCompilerOptions(myCompilerId, options); } @Override public void loadExtensionWithDefaultSettings(@NotNull JpsProject project) { - JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(project); + JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getCompilerConfiguration(project); configuration.setCompilerOptions(myCompilerId, new JpsJavaCompilerOptions()); } diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsJavaCompilerWorkspaceConfigurationSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsJavaCompilerWorkspaceConfigurationSerializer.java index 462309da1480..b6a941797d7d 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsJavaCompilerWorkspaceConfigurationSerializer.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsJavaCompilerWorkspaceConfigurationSerializer.java @@ -33,7 +33,7 @@ public class JpsJavaCompilerWorkspaceConfigurationSerializer extends JpsProjectE @Override public void loadExtension(@NotNull JpsProject project, @NotNull Element componentTag) { - JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(project); + JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getCompilerConfiguration(project); String assertNotNull = JDOMExternalizerUtil.readField(componentTag, "ASSERT_NOT_NULL"); if (assertNotNull != null) { configuration.setAddNotNullAssertions(Boolean.parseBoolean(assertNotNull)); diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsValidationSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsValidationSerializer.java index 34f6dc267adc..18dbfd361f72 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsValidationSerializer.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/JpsValidationSerializer.java @@ -24,7 +24,7 @@ public class JpsValidationSerializer extends JpsProjectExtensionSerializer { @Override public void loadExtension(@NotNull JpsProject project, @NotNull Element componentTag) { - JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(project); + JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getCompilerConfiguration(project); ValidationConfigurationState state = XmlSerializer.deserialize(componentTag, ValidationConfigurationState.class); Set disabledValidators = state.VALIDATORS.entrySet().stream() .filter(e -> e.getValue() == Boolean.FALSE) diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/RmicCompilerOptionsSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/RmicCompilerOptionsSerializer.java index fea8646d5c93..d309fa1806e0 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/RmicCompilerOptionsSerializer.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/compiler/RmicCompilerOptionsSerializer.java @@ -37,14 +37,14 @@ public class RmicCompilerOptionsSerializer extends JpsProjectExtensionSerializer @Override public void loadExtension(@NotNull JpsProject project, @NotNull Element componentTag) { - JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(project); + JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getCompilerConfiguration(project); RmicCompilerOptions options = XmlSerializer.deserialize(componentTag, RmicCompilerOptions.class); configuration.setCompilerOptions(myCompilerId, options); } @Override public void loadExtensionWithDefaultSettings(@NotNull JpsProject project) { - JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(project); + JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getCompilerConfiguration(project); configuration.setCompilerOptions(myCompilerId, new RmicCompilerOptions()); } diff --git a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GreclipseBuilder.java b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GreclipseBuilder.java index f78f47b25190..e83c8f4a1db9 100644 --- a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GreclipseBuilder.java +++ b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GreclipseBuilder.java @@ -203,7 +203,7 @@ public class GreclipseBuilder extends ModuleLevelBuilder { static boolean useGreclipse(CompileContext context) { JpsProject project = context.getProjectDescriptor().getProject(); - return ID.equals(JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(project).getJavaCompilerId()); + return ID.equals(JpsJavaExtensionService.getInstance().getCompilerConfiguration(project).getJavaCompilerId()); } private boolean performCompilation(List args, StringWriter out, StringWriter err, Map> outputs, CompileContext context, ModuleChunk chunk) { diff --git a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/JpsGroovycRunner.java b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/JpsGroovycRunner.java index a601955b9752..ab3f6bb5a7c0 100644 --- a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/JpsGroovycRunner.java +++ b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/JpsGroovycRunner.java @@ -428,7 +428,7 @@ public abstract class JpsGroovycRunner buildClassToSourceMap(ModuleChunk chunk, CompileContext context, Set toCompilePaths, Map finalOutputs) throws IOException { final Map class2Src = new HashMap<>(); - JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration( + JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getCompilerConfiguration( context.getProjectDescriptor().getProject()); for (T target : getTargets(chunk)) { String moduleOutputPath = finalOutputs.get(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 9e8b25dd67f4..60041ac7a072 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 @@ -115,7 +115,7 @@ public class FormsBindingManager extends FormsBuilder { }); if (config.isInstrumentClasses()) { - final JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(project); + final JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getCompilerConfiguration(project); final JpsCompilerExcludes excludes = configuration.getCompilerExcludes(); // force compilation of bound source file if the form is dirty