From 2c7a0ea8fdcdde07b41e8d049eb472807df72eea Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Fri, 10 Aug 2018 15:24:59 +0300 Subject: [PATCH] Gradle/C++: compatibility fix for the Gradle 4.10 --- .../tooling/src/builder/CppModelBuilder.java | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/plugins/gradle/native/tooling/src/builder/CppModelBuilder.java b/plugins/gradle/native/tooling/src/builder/CppModelBuilder.java index 8bbc74352e63..e8c0603db3aa 100644 --- a/plugins/gradle/native/tooling/src/builder/CppModelBuilder.java +++ b/plugins/gradle/native/tooling/src/builder/CppModelBuilder.java @@ -3,15 +3,11 @@ package org.jetbrains.plugins.gradle.nativeplatform.tooling.builder; import org.gradle.api.Project; import org.gradle.api.component.SoftwareComponent; -import org.gradle.api.file.*; -import org.gradle.api.internal.file.FileCollectionInternal; -import org.gradle.api.internal.file.FileCollectionVisitor; -import org.gradle.api.internal.file.FileTreeInternal; -import org.gradle.api.internal.file.collections.DirectoryFileTree; +import org.gradle.api.file.FileCollection; +import org.gradle.api.file.RegularFileProperty; import org.gradle.api.internal.project.DefaultProject; import org.gradle.api.plugins.PluginContainer; import org.gradle.api.provider.Provider; -import org.gradle.api.tasks.util.PatternSet; import org.gradle.internal.impldep.org.apache.commons.lang.StringUtils; import org.gradle.internal.os.OperatingSystem; import org.gradle.language.cpp.CppBinary; @@ -48,16 +44,21 @@ import org.jetbrains.plugins.gradle.tooling.ModelBuilderService; import java.io.File; import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.util.*; /** * The prototype of the C++ project gradle tooling model builder. * This implementation should be moved or replaced with the similar model builder from the Gradle distribution. * + * @deprecated to be removed in 2019.1, use built-in 'org.gradle.tooling.model.cpp.CppComponent' available since Gradle 4.10 + * * @author Vladislav.Soroka */ public class CppModelBuilder implements ModelBuilderService { - private static final boolean IS_48_OR_BETTER = GradleVersion.current().getBaseVersion().compareTo(GradleVersion.version("4.8")) >= 0; + private static final boolean IS_410_OR_BETTER = GradleVersion.current().getBaseVersion().compareTo(GradleVersion.version("4.10")) >= 0; + private static final boolean IS_48_OR_BETTER = IS_410_OR_BETTER || + GradleVersion.current().getBaseVersion().compareTo(GradleVersion.version("4.8")) >= 0; private static final boolean IS_47_OR_BETTER = IS_48_OR_BETTER || GradleVersion.current().getBaseVersion().compareTo(GradleVersion.version("4.7")) >= 0; private static final boolean IS_41_OR_BETTER = IS_47_OR_BETTER || @@ -71,7 +72,8 @@ public class CppModelBuilder implements ModelBuilderService { @Nullable @Override public Object buildAll(final String modelName, final Project project) { - if(!IS_41_OR_BETTER) { + // uncomment when 'org.gradle.tooling.model.cpp.CppComponent' will be used for the import + if (!IS_41_OR_BETTER /*|| IS_410_OR_BETTER*/) { return null; } PluginContainer pluginContainer = project.getPlugins(); @@ -240,23 +242,15 @@ public class CppModelBuilder implements ModelBuilderService { } FileCollection cppSource = cppComponent.getCppSource(); - // try to resolve cpp source folders - ((FileCollectionInternal)cppSource).visitRootElements(new FileCollectionVisitor() { - @Override - public void visitCollection(FileCollectionInternal internal) { - } - - @Override - public void visitTree(FileTreeInternal internal) { - } - - @Override - public void visitDirectoryTree(DirectoryFileTree tree) { - File dir = tree.getDir(); - PatternSet patterns = tree.getPatterns(); - cppProject.addSourceFolder(new SourceFolderImpl(dir, new FilePatternSetImpl(patterns.getIncludes(), patterns.getExcludes()))); - } - }); + // resolve cpp source folders + Set dirs = new LinkedHashSet(); + for (File file : cppSource.getFiles()) { + dirs.add(file.getParentFile()); + } + for (File dir : dirs) { + cppProject.addSourceFolder(new SourceFolderImpl( + dir, new FilePatternSetImpl(Collections.emptySet(), Collections.emptySet()))); + } } @Nullable @@ -265,12 +259,19 @@ public class CppModelBuilder implements ModelBuilderService { try { if (cppBinary instanceof ConfigurableComponentWithExecutable) { PlatformToolProvider toolProvider = ((ConfigurableComponentWithExecutable)cppBinary).getPlatformToolProvider(); - ToolSearchResult toolSearchResult = toolProvider.isToolAvailable(ToolType.CPP_COMPILER); + ToolSearchResult toolSearchResult; + if (IS_410_OR_BETTER) { + Method locateToolMethod = toolProvider.getClass().getDeclaredMethod("locateTool", ToolType.class); + toolSearchResult = (ToolSearchResult)locateToolMethod.invoke(toolProvider, ToolType.CPP_COMPILER); + } + else { + toolSearchResult = toolProvider.isToolAvailable(ToolType.CPP_COMPILER); + } if (toolSearchResult.isAvailable()) { if (toolSearchResult instanceof CommandLineToolSearchResult) { return ((CommandLineToolSearchResult)toolSearchResult).getTool(); } - // dirty hack because of dummy implementation of org.gradle.nativeplatform.toolchain.internal.msvcpp.VisualCppPlatformToolProvider.isToolAvailable + // dirty hack for gradle versions <= 4.9 because of dummy implementation of org.gradle.nativeplatform.toolchain.internal.msvcpp.VisualCppPlatformToolProvider.isToolAvailable if (toolProvider.getClass().getSimpleName().equals("VisualCppPlatformToolProvider")) { Field visualCppField = toolProvider.getClass().getDeclaredField("visualCpp"); visualCppField.setAccessible(true);