Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
bd3b270
#6265
ahmedyarub Apr 4, 2024
4fd8cb6
Closes #6265
ahmedyarub Apr 4, 2024
c136cba
Update base/src/com/google/idea/blaze/base/projectview/section/ListSe…
ahmedyarub Apr 4, 2024
26b72a3
Update base/src/com/google/idea/blaze/base/projectview/section/ListSe…
ahmedyarub Apr 4, 2024
b4064ef
Update base/src/com/google/idea/blaze/base/projectview/section/sectio…
ahmedyarub Apr 4, 2024
f66cb55
Merge branch 'master' into ay/target_management
ahmedyarub Apr 4, 2024
07b898c
Merge branch 'master' of https://github.com/bazelbuild/intellij into …
ahmedyarub Apr 5, 2024
301f070
Closes #6370
ahmedyarub Apr 7, 2024
17dee1f
Closes #6370
ahmedyarub Apr 7, 2024
17e14d0
Revert local change
ahmedyarub Apr 7, 2024
d14bfdb
Merge branch 'master' into ay/target_management
ahmedyarub Apr 7, 2024
5f4a576
Fix Android SDK Platform section
ahmedyarub Apr 7, 2024
1b8c93c
Fix Android SDK Platform section
ahmedyarub Apr 7, 2024
28957ed
Fix list parser test
ahmedyarub Apr 7, 2024
9d5dbe2
#6370 Fix parsing
ahmedyarub Apr 7, 2024
09e8cea
Merge branch 'master' of https://github.com/bazelbuild/intellij into …
ahmedyarub Apr 8, 2024
763bd00
#6370
ahmedyarub Apr 8, 2024
30ca35d
Update base/src/com/google/idea/blaze/base/projectview/ProjectView.java
ahmedyarub Apr 8, 2024
88f1366
Merge branch 'master' of https://github.com/bazelbuild/intellij into …
ahmedyarub Apr 8, 2024
44ff380
Merge branch 'master' of https://github.com/bazelbuild/intellij into …
ahmedyarub Apr 9, 2024
0190e70
Merge branch 'master' of https://github.com/bazelbuild/intellij into …
ahmedyarub Apr 10, 2024
a828159
Merge remote-tracking branch 'ahmedyarub/ay/section_line_number' into…
ahmedyarub Apr 10, 2024
3f1665d
Merge branch 'master' of https://github.com/bazelbuild/intellij into …
Apr 18, 2024
f7a18e3
Merge branch 'master' of https://github.com/bazelbuild/intellij into …
Apr 19, 2024
10945c6
#6370
Apr 22, 2024
f4c21ce
Merge branch 'master' of https://github.com/bazelbuild/intellij into …
Apr 22, 2024
1d4e61f
Merge branch 'refs/heads/ay/section_line_number' into ay/target_manag…
Apr 22, 2024
0db4830
Merge remote-tracking branch 'ahmedyarub/ay/target_management' into a…
Apr 22, 2024
dd952b7
#6370
Apr 22, 2024
89df2d9
#6370
Apr 22, 2024
0ecd5bd
#6370
Apr 23, 2024
f409635
Update aswb/src/com/google/idea/blaze/android/projectview/AndroidSdkP…
ahmedyarub Apr 23, 2024
ba6bd57
Update aswb/src/com/google/idea/blaze/android/projectview/AndroidSdkP…
ahmedyarub Apr 23, 2024
9b0d15b
Update aswb/src/com/google/idea/blaze/android/projectview/AndroidSdkP…
ahmedyarub Apr 23, 2024
0f710f9
Update aswb/src/com/google/idea/blaze/android/projectview/AndroidSdkP…
ahmedyarub Apr 23, 2024
16161ba
Update base/src/com/google/idea/blaze/base/projectview/ProjectView.java
ahmedyarub Apr 23, 2024
111957c
Update base/src/com/google/idea/blaze/base/projectview/section/sectio…
ahmedyarub Apr 23, 2024
3b96874
Update base/src/com/google/idea/blaze/base/projectview/section/sectio…
ahmedyarub Apr 23, 2024
f63dd53
#6370
Apr 23, 2024
9cd006a
#6370
Apr 23, 2024
66a0f50
Merge remote-tracking branch 'ahmedyarub/ay/section_line_number' into…
Apr 23, 2024
3891093
Merge branch 'refs/heads/ay/section_line_number' into ay/target_manag…
Apr 23, 2024
df09fc3
#6265
Apr 23, 2024
a28e51f
#6370
Apr 23, 2024
bf28bc9
Merge branch 'refs/heads/ay/section_line_number' into ay/target_manag…
Apr 23, 2024
057685f
#6265
Apr 23, 2024
9aa305e
#6265
Apr 23, 2024
b506482
#6265
Apr 23, 2024
3d4299a
Merge branch 'master' of https://github.com/bazelbuild/intellij into …
Apr 25, 2024
2302d6a
Merge branch 'master' into ay/section_line_number
ahmedyarub Apr 25, 2024
a92a4a4
Merge branch 'master' into ay/target_management
ahmedyarub Apr 25, 2024
65971e0
Merge branch 'ay/target_management' of https://github.com/ahmedyarub/…
Apr 26, 2024
64d085f
Update aswb/src/com/google/idea/blaze/android/projectview/AndroidSdkP…
ahmedyarub May 2, 2024
10f28d4
Merge branch 'refs/heads/ay/section_line_number' into ay/target_manag…
ahmedyarub May 3, 2024
90376a2
Merge branch 'master' of https://github.com/bazelbuild/intellij into …
ahmedyarub May 7, 2024
657bc45
Merge branch 'master' into ay/target_management
ahmedyarub May 13, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions base/src/META-INF/blaze-base.xml
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,10 @@
<codeInsight.lineMarkerProvider
language="BUILD"
implementationClass="com.google.idea.blaze.base.query.MacroLineMarkerProvider"/>
<codeInsight.lineMarkerProvider
language="projectview"
implementationClass="com.google.idea.blaze.base.projectview.section.DirectoryLineMarkerProvider"/>

<runLineMarkerContributor
language="BUILD"
implementationClass="com.google.idea.blaze.base.run.producers.BuildFileRunLineMarkerContributor"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,14 @@ public static class Builder {
sections.addAll(projectView.sections);
}

@SuppressWarnings("unchecked")
public <T, SectionType extends Section<T>> List<SectionType> getAll(SectionKey<T, SectionType> key) {
return sections.stream()
.filter(section -> section.isSectionType(key))
.map(section -> (SectionType) section)
.toList();
}

/** Gets the last section of the type in the builder. Useful to add on to sections. */
@SuppressWarnings("unchecked")
@Nullable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ public ProjectViewSet getResult() {
public static String projectViewToString(ProjectView projectView) {
StringBuilder sb = new StringBuilder();

int curLineIndex = 0;
List<SectionParser> sectionParsers = Sections.getParsers();
for (Section<?> section : projectView.getSections()) {
SectionParser sectionParser =
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
/*
* Copyright 2024 The Bazel Authors. All rights reserved.
*
* 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 com.google.idea.blaze.base.projectview.section;

import com.google.idea.blaze.base.lang.projectview.psi.ProjectViewPsiListItem;
import com.google.idea.blaze.base.lang.projectview.psi.ProjectViewPsiListSection;
import com.google.idea.blaze.base.model.primitives.TargetExpression;
import com.google.idea.blaze.base.model.primitives.WorkspacePath;
import com.google.idea.blaze.base.projectview.ProjectView;
import com.google.idea.blaze.base.projectview.ProjectViewEdit;
import com.google.idea.blaze.base.projectview.section.sections.DirectoryEntry;
import com.google.idea.blaze.base.projectview.section.sections.DirectorySection;
import com.google.idea.blaze.base.projectview.section.sections.TargetSection;
import com.google.idea.blaze.base.settings.ui.AddDirectoryToProjectAction;
import com.google.idea.common.experiments.BoolExperiment;
import com.intellij.codeInsight.daemon.LineMarkerInfo;
import com.intellij.codeInsight.daemon.LineMarkerProvider;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.editor.markup.GutterIconRenderer;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.ui.Messages;
import com.intellij.psi.PsiElement;
import com.intellij.psi.impl.source.tree.LeafPsiElement;
import org.jetbrains.annotations.NotNull;

import javax.annotation.Nullable;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

/**
* A line marker provider for project view files, showing a plus icon for adding new directories.
*/
public class DirectoryLineMarkerProvider implements LineMarkerProvider {

private static final BoolExperiment enabled = new BoolExperiment("projectview.directory.section.gutter.icons.enabled", true);

@Nullable
@Override
@SuppressWarnings("rawtypes")
public LineMarkerInfo getLineMarkerInfo(@NotNull PsiElement element) {
if (enabled.getValue() && element instanceof LeafPsiElement leafPsiElement && leafPsiElement.getStartOffsetInParent() == 0) {
if (element.getText().equals("directories") &&
leafPsiElement.getParent() instanceof ProjectViewPsiListSection) {
return new LineMarkerInfo<>(
element,
element.getTextRange(),
AllIcons.Actions.AddFile,
psi -> "Add Directory to Project",
(e, elt) -> AddDirectoryToProjectAction.runAction(element.getProject(), null),
GutterIconRenderer.Alignment.RIGHT,
() -> "Add Directory to Project");
} else if (element.getParent() instanceof ProjectViewPsiListItem parent) {
var parentTag = parent.getParent().getFirstChild().getText();

if (parentTag.equals("directories") || parentTag.equals("targets")) {
var disabled = element.getText().startsWith("-");
var txt = disabled ? "Enable" : "Disable";
var icon = disabled ? AllIcons.Diff.GutterCheckBox : AllIcons.Diff.GutterCheckBoxSelected;

return new LineMarkerInfo<>(
element,
element.getTextRange(),
icon,
psi -> txt,
(e, elt) -> toggleSectionItem(elt, disabled, parentTag),
GutterIconRenderer.Alignment.RIGHT,
() -> txt);
}
}
}

return null;
}

@Override
public void collectSlowLineMarkers(@NotNull List<? extends PsiElement> elements, @NotNull Collection<? super LineMarkerInfo<?>> result) {
}

private void toggleSectionItem(PsiElement elt, boolean disabled, String parentTag) {
ProjectViewEdit.ProjectViewEditor action = switch (parentTag) {
case "directories" -> (builder) -> toggleDirectory(builder, elt, disabled);
case "targets" -> (builder) -> toggleTarget(builder, elt, disabled);
default -> null;
};

if (action == null) {
Messages.showErrorDialog(
"Could not modify project view: invalid tag %s.".formatted(parentTag),
"Error");
return;
}

var edit = ProjectViewEdit.editLocalProjectView(elt.getProject(), action);

if (edit == null) {
Messages.showErrorDialog(
"Could not modify project view. Check for errors in your project view and try again",
"Error");
return;
}

edit.apply();
}

private static boolean toggleDirectory(ProjectView.Builder builder, PsiElement elt, boolean disabled) {
int elementLineNumber = getPsiElementLineNumber(elt);

var optionalSection = getListByLineNumber(builder, DirectorySection.KEY, elementLineNumber);

if (optionalSection.isEmpty()) {
return false;
}

var listSection = optionalSection.get();

var directoriesUpdater = ListSection.update(DirectorySection.KEY, listSection);

var directoryStr = elt.getText().substring(disabled ? 1 : 0);

directoriesUpdater.replaceElement(
elementLineNumber,
disabled ?
DirectoryEntry.include(new WorkspacePath(directoryStr)) :
DirectoryEntry.exclude(new WorkspacePath(directoryStr))
);

builder.replace(listSection, directoriesUpdater);

return true;
}

private static boolean toggleTarget(ProjectView.Builder builder, PsiElement elt, boolean disabled) {
int elementLineNumber = getPsiElementLineNumber(elt);

var optionalSection = getListByLineNumber(builder, TargetSection.KEY, elementLineNumber);

if (optionalSection.isEmpty()) {
return false;
}

var listSection = optionalSection.get();

var targetsUpdater = ListSection.update(TargetSection.KEY, listSection);

var targetStr = elt.getText();

targetsUpdater.replaceElement(
getPsiElementLineNumber(elt),
disabled ?
TargetExpression.fromStringSafe(targetStr.substring(1)) :
TargetExpression.fromStringSafe('-' + targetStr)
);

builder.replace(listSection, targetsUpdater);

return true;
}

private static <T, SectionType extends Section<T>> Optional<SectionType> getListByLineNumber(ProjectView.Builder builder, SectionKey<T, SectionType> key, int lineNumber) {
for (var section : builder.getAll(key)) {
if (section instanceof ListSection<?> listSection && listSection.hasLineNumber(lineNumber)) {
return Optional.of(section);
}
}

return Optional.empty();
}

private static int getPsiElementLineNumber(PsiElement elt) {
return Objects.requireNonNull(
FileDocumentManager
.getInstance()
.getDocument(
elt.getContainingFile()
.getVirtualFile()
)
).getLineNumber(
elt.getTextRange()
.getStartOffset()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,10 @@ public static <T> Builder<T> update(
return new Builder<>(sectionKey, section);
}

public boolean hasLineNumber(int elementLineNumber) {
return getFirstLineIndex() == elementLineNumber || itemsOrComments().stream().anyMatch(it ->it.getLineIndex() == elementLineNumber);
}

/** Builder for list sections */
public static class Builder<T> extends SectionBuilder<T, ListSection<T>> {
private final List<ItemOrTextBlock<T>> items = new ArrayList<>();
Expand Down Expand Up @@ -150,6 +154,18 @@ public final Builder<T> removeAll(T item) {
return this;
}

@CanIgnoreReturnValue
public final Builder<T> replaceElement(int lineIndex, T with) {
for (int i = 0; i < items.size(); i++) {
if (items.get(i).getLineIndex() == lineIndex) {
items.set(i, new ItemOrTextBlock<>(with, lineIndex));
break;
}
}

return this;
}

@Override
public final ListSection<T> build() {
return new ListSection<>(getSectionKey(), ImmutableList.copyOf(items), firstLineNumber);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,9 @@ public final void print(StringBuilder sb, Section<?> section) {
if (divider != ' ') {
sb.append(' ');
}
printItem(sb, ((ScalarSection<T>) section).getValue());
var scalarSection = (ScalarSection<T>) section;

printItem(sb, scalarSection.getValue());
sb.append('\n');
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import java.io.Serializable;

/**
* A section is a part of an project view file. For instance:
* A section is a part of a project view file. For instance:
*
* <p>directories java/com/a java/com/b
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,16 @@ public static TextBlock newLine(int firstLineIndex) {
return new TextBlock(ImmutableList.of(""), firstLineIndex);
}

public void print(StringBuilder sb) {
@CanIgnoreReturnValue
public int print(StringBuilder sb) {
int addedLines = 0;
for (String line : lines) {
sb.append(line);
sb.append('\n');
addedLines += 1;
}

return addedLines;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ private static TextBlock parseTextBlock(ParseContext parseContext, Pattern regex
@Override
public void print(StringBuilder sb, Section<?> section) {
TextBlockSection textBlockSection = (TextBlockSection) section;

textBlockSection.getTextBlock().print(sb);
}

Expand Down