From 9761255e76f176e7644b93ff92c2595cff331c4a Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Tue, 29 Sep 2015 13:56:54 +0300 Subject: [PATCH] IDEA-143319 Gradle: add path anchor in gradle task output --- plugins/gradle/src/META-INF/plugin.xml | 1 + .../gradle/execution/GradleConsoleFilter.java | 104 ++++++++++++++++++ .../GradleConsoleFilterProvider.java | 33 ++++++ .../execution/GradleConsoleFilterTest.java | 37 +++++++ 4 files changed, 175 insertions(+) create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleConsoleFilter.java create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleConsoleFilterProvider.java create mode 100644 plugins/gradle/testSources/org/jetbrains/plugins/gradle/execution/GradleConsoleFilterTest.java diff --git a/plugins/gradle/src/META-INF/plugin.xml b/plugins/gradle/src/META-INF/plugin.xml index 0b9157afa8f2..2a5f1a245638 100644 --- a/plugins/gradle/src/META-INF/plugin.xml +++ b/plugins/gradle/src/META-INF/plugin.xml @@ -78,6 +78,7 @@ + diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleConsoleFilter.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleConsoleFilter.java new file mode 100644 index 000000000000..0bf9fb4bfdda --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleConsoleFilter.java @@ -0,0 +1,104 @@ +/* + * Copyright 2000-2015 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.plugins.gradle.execution; + +import com.intellij.execution.filters.Filter; +import com.intellij.execution.filters.OpenFileHyperlinkInfo; +import com.intellij.openapi.editor.colors.CodeInsightColors; +import com.intellij.openapi.editor.colors.EditorColorsManager; +import com.intellij.openapi.editor.markup.TextAttributes; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.Nullable; + +import java.awt.*; +import java.io.File; + +/** + * @author Vladislav.Soroka + * @since 9/29/2015 + */ +public class GradleConsoleFilter implements Filter { + private final Project myProject; + private static final TextAttributes HYPERLINK_ATTRIBUTES = + EditorColorsManager.getInstance().getGlobalScheme().getAttributes(CodeInsightColors.HYPERLINK_ATTRIBUTES); + private String myFilteredFileName; + private int myFilteredLineNumber; + + public GradleConsoleFilter(Project project) { + myProject = project; + } + + @Nullable + @Override + public Result applyFilter(String line, int entireLength) { + final String filePrefix = "Build file '"; + final String linePrefix = "' line: "; + int filePrefixIndex = StringUtil.indexOf(line, filePrefix); + if (filePrefixIndex == -1) { + return null; + } + + final String fileAndLineNumber = line.substring(filePrefix.length() + filePrefixIndex); + int linePrefixIndex = StringUtil.indexOf(fileAndLineNumber, linePrefix); + + if (linePrefixIndex == -1) { + return null; + } + + final String fileName = fileAndLineNumber.substring(0, linePrefixIndex); + myFilteredFileName = fileName; + String lineNumberStr = fileAndLineNumber.substring(linePrefixIndex + linePrefix.length(), fileAndLineNumber.length()).trim(); + int lineNumber; + try { + lineNumber = Integer.parseInt(lineNumberStr); + myFilteredLineNumber = lineNumber; + } + catch (NumberFormatException e) { + return null; + } + + final VirtualFile file = LocalFileSystem.getInstance().findFileByPath(fileName.replace(File.separatorChar, '/')); + if (file == null) { + return null; + } + + int textStartOffset = entireLength - line.length() + filePrefix.length(); + int highlightEndOffset = textStartOffset + fileName.length(); + + OpenFileHyperlinkInfo info = new OpenFileHyperlinkInfo(myProject, file, Math.max(lineNumber - 1, 0)); + + TextAttributes attributes = HYPERLINK_ATTRIBUTES.clone(); + if (!ProjectRootManager.getInstance(myProject).getFileIndex().isInContent(file)) { + Color color = UIUtil.getInactiveTextColor(); + attributes.setForegroundColor(color); + attributes.setEffectColor(color); + } + return new Result(textStartOffset, highlightEndOffset, info, attributes); + } + + public String getFilteredFileName() { + return myFilteredFileName; + } + + public int getFilteredLineNumber() { + return myFilteredLineNumber; + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleConsoleFilterProvider.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleConsoleFilterProvider.java new file mode 100644 index 000000000000..357999acf715 --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleConsoleFilterProvider.java @@ -0,0 +1,33 @@ +/* + * Copyright 2000-2015 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.plugins.gradle.execution; + +import com.intellij.execution.filters.ConsoleFilterProvider; +import com.intellij.execution.filters.Filter; +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; + +/** + * @author Vladislav.Soroka + * @since 9/29/2015 + */ +public class GradleConsoleFilterProvider implements ConsoleFilterProvider { + @NotNull + @Override + public Filter[] getDefaultFilters(@NotNull final Project project) { + return new Filter[]{new GradleConsoleFilter(project)}; + } +} diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/execution/GradleConsoleFilterTest.java b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/execution/GradleConsoleFilterTest.java new file mode 100644 index 000000000000..5d9e648f6b3a --- /dev/null +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/execution/GradleConsoleFilterTest.java @@ -0,0 +1,37 @@ +/* + * Copyright 2000-2015 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.plugins.gradle.execution; + +import com.intellij.testFramework.fixtures.CodeInsightFixtureTestCase; + +/** + * @author Vladislav.Soroka + * @since 9/29/2015 + */ +public class GradleConsoleFilterTest extends CodeInsightFixtureTestCase { + + public void testApplyFilter() throws Exception { + doTest("Build file 'C:\\project\\build.gradle' line: 7", "C:\\project\\build.gradle", 7); + doTest("Build file '/project/build.gradle' line: 7", "/project/build.gradle", 7); + } + + private void doTest(String line, String expectedFileName, int expectedLineNumber) { + GradleConsoleFilter filter = new GradleConsoleFilter(myFixture.getProject()); + filter.applyFilter(line, 0); + assertEquals(expectedFileName, filter.getFilteredFileName()); + assertEquals(expectedLineNumber, filter.getFilteredLineNumber()); + } +} \ No newline at end of file