From 951f57a7d3ac10a9e28607ba37c9c28528f918d6 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Tue, 5 Mar 2013 16:03:04 +0100 Subject: [PATCH 01/57] No real need of this registering. --- .../execution/runners/AbstractConsoleRunnerWithHistory.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java b/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java index bf8b74dc83be..820a56a66b9d 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java @@ -122,8 +122,6 @@ public abstract class AbstractConsoleRunnerWithHistory actions = fillToolBarActions(toolbarActions, defaultExecutor, contentDescriptor); registerActionShortcuts(actions, getLanguageConsole().getConsoleEditor().getComponent()); From a8be27d237b0e052ea06f90f64da281cdbf3a2c6 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Wed, 6 Mar 2013 14:05:44 +0100 Subject: [PATCH 02/57] Handling for staticfiles_dirs prefixes (PY-8065). --- .../psi/impl/SyntheticFileSystemItem.java | 156 ++++++++++++++++++ .../impl/providers/FileReferenceSet.java | 13 +- 2 files changed, 165 insertions(+), 4 deletions(-) create mode 100644 platform/lang-impl/src/com/intellij/psi/impl/SyntheticFileSystemItem.java diff --git a/platform/lang-impl/src/com/intellij/psi/impl/SyntheticFileSystemItem.java b/platform/lang-impl/src/com/intellij/psi/impl/SyntheticFileSystemItem.java new file mode 100644 index 000000000000..4e10d2bb1cd5 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/psi/impl/SyntheticFileSystemItem.java @@ -0,0 +1,156 @@ +/* + * @author max + */ +package com.intellij.psi.impl; + +import com.intellij.lang.ASTNode; +import com.intellij.lang.Language; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.*; +import com.intellij.psi.search.PsiElementProcessor; +import com.intellij.util.ArrayUtil; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public abstract class SyntheticFileSystemItem extends PsiElementBase implements PsiFileSystemItem { + public static final Logger LOG = Logger.getInstance("#" + SyntheticFileSystemItem.class.getPackage().getName()); + + protected final Project myProject; + protected final PsiManager myManager; + + public SyntheticFileSystemItem(Project project) { + myProject = project; + myManager = PsiManager.getInstance(myProject); + } + + public boolean isDirectory() { + return true; + } + + public ASTNode getNode() { + return null; + } + + public boolean isPhysical() { + return true; + } + + public boolean isWritable() { + return true; + } + + public boolean isValid() { + final VirtualFile virtualFile = getVirtualFile(); + return virtualFile != null && virtualFile.isValid(); + } + + public PsiElement replace(@NotNull final PsiElement newElement) throws IncorrectOperationException { + throw new IncorrectOperationException("Frameworks cannot be changed"); + } + + public void checkDelete() throws IncorrectOperationException { + throw new IncorrectOperationException("Frameworks cannot be deleted"); + } + + public void delete() throws IncorrectOperationException { + throw new IncorrectOperationException("Frameworks cannot be deleted"); + } + + public void accept(@NotNull final PsiElementVisitor visitor) { + // TODO + } + + @NotNull + public PsiElement[] getChildren() { + final PsiElementProcessor.CollectElements collector = new PsiElementProcessor.CollectElements(); + processChildren(collector); + return collector.toArray(new PsiFileSystemItem[0]); + } + + public PsiManager getManager() { + return myManager; + } + + @NotNull + public Language getLanguage() { + return Language.ANY; + } + + public void checkSetName(final String name) throws IncorrectOperationException { + throw new IncorrectOperationException("Frameworks cannot be renamed"); + } + + public PsiElement setName(@NonNls @NotNull final String name) throws IncorrectOperationException { + throw new IncorrectOperationException("Frameworks cannot be renamed"); + } + + @Nullable + public PsiFile getContainingFile() { + return null; + } + + @Nullable + public TextRange getTextRange() { + return null; + } + + public int getStartOffsetInParent() { + return -1; + } + + public int getTextLength() { + return -1; + } + + public PsiElement findElementAt(int offset) { + return null; + } + + public int getTextOffset() { + return -1; + } + + @Nullable + public String getText() { + return null; + } + + @NotNull + public char[] textToCharArray() { + return ArrayUtil.EMPTY_CHAR_ARRAY; // TODO throw new InsupportedOperationException() + } + + public boolean textMatches(@NotNull CharSequence text) { + return false; + } + + public boolean textMatches(@NotNull PsiElement element) { + return false; + } + + public PsiElement copy() { + LOG.error("method not implemented"); + return null; + } + + public PsiElement add(@NotNull PsiElement element) throws IncorrectOperationException { + throw new IncorrectOperationException(); + } + + public PsiElement addBefore(@NotNull PsiElement element, PsiElement anchor) throws IncorrectOperationException { + throw new IncorrectOperationException(); + } + + public PsiElement addAfter(@NotNull PsiElement element, PsiElement anchor) throws IncorrectOperationException { + throw new IncorrectOperationException(); + } + + public void checkAdd(@NotNull PsiElement element) throws IncorrectOperationException { + throw new IncorrectOperationException(); + } +} diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReferenceSet.java b/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReferenceSet.java index 5a42c4244984..6629702a628d 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReferenceSet.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReferenceSet.java @@ -215,6 +215,12 @@ public class FileReferenceSet { protected void reparse() { String str = myPathStringNonTrimmed; + final List referencesList = reparse(str, myStartInElement); + + myReferences = referencesList.toArray(new FileReference[referencesList.size()]); + } + + protected List reparse(String str, int startInElement) { final List referencesList = new ArrayList(); @@ -235,7 +241,7 @@ public class FileReferenceSet { if (str.equals(separatorString)) { final FileReference fileReference = - createFileReference(new TextRange(myStartInElement, myStartInElement + sepLen), index++, separatorString); + createFileReference(new TextRange(startInElement, startInElement + sepLen), index++, separatorString); referencesList.add(fileReference); } @@ -243,7 +249,7 @@ public class FileReferenceSet { final int nextSlash = str.indexOf(separatorString, currentSlash + sepLen); final String subreferenceText = nextSlash > 0 ? str.substring(currentSlash + sepLen, nextSlash) : str.substring(currentSlash + sepLen); final FileReference ref = createFileReference( - new TextRange(myStartInElement + currentSlash + sepLen, myStartInElement + (nextSlash > 0 ? nextSlash : str.length())), + new TextRange(startInElement + currentSlash + sepLen, startInElement + (nextSlash > 0 ? nextSlash : str.length())), index++, subreferenceText); referencesList.add(ref); @@ -251,8 +257,7 @@ public class FileReferenceSet { break; } } - - myReferences = referencesList.toArray(new FileReference[referencesList.size()]); + return referencesList; } public FileReference getReference(int index) { From 7e42cf3f3195517cc7c647e1fa8d2a323d8cc031 Mon Sep 17 00:00:00 2001 From: VISTALL Date: Thu, 7 Mar 2013 14:37:30 +0200 Subject: [PATCH 03/57] IDEA-97675 There is no 'constructor call' usage in code preview in 'colors & fonts' for Java --- .../openapi/options/colors/pages/JavaColorSettingsPage.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/java/java-impl/src/com/intellij/openapi/options/colors/pages/JavaColorSettingsPage.java b/java/java-impl/src/com/intellij/openapi/options/colors/pages/JavaColorSettingsPage.java index 3c584077122e..8697b8b37558 100644 --- a/java/java-impl/src/com/intellij/openapi/options/colors/pages/JavaColorSettingsPage.java +++ b/java/java-impl/src/com/intellij/openapi/options/colors/pages/JavaColorSettingsPage.java @@ -18,8 +18,6 @@ package com.intellij.openapi.options.colors.pages; import com.intellij.application.options.colors.InspectionColorSettingsPage; import com.intellij.ide.highlighter.JavaFileHighlighter; import com.intellij.ide.highlighter.JavaHighlightingColors; -import com.intellij.openapi.editor.HighlighterColors; -import com.intellij.openapi.editor.SyntaxHighlighterColors; import com.intellij.openapi.editor.colors.CodeInsightColors; import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.fileTypes.StdFileTypes; @@ -181,7 +179,7 @@ public class JavaColorSettingsPage implements ColorSettingsPage, InspectionColor " int a = localVar;\n" + " }\n" + " };\n" + - " reassignedParam = new int[2];\n" + + " reassignedParam = new ArrayList<String>().toArray(new int[0]);\n" + " }\n" + "}\n" + "enum AnEnum { CONST1, CONST2 }\n"+ From 137d73db691f14246a205f69c06da594fbea3b89 Mon Sep 17 00:00:00 2001 From: VISTALL Date: Thu, 7 Mar 2013 14:58:52 +0200 Subject: [PATCH 04/57] IDEA-99364 Highlighting constructor correction - highlight only javaReference, without type parameters --- .../daemon/impl/analysis/HighlightVisitorImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index 7d97295b8bab..1a9ecda975ae 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -707,7 +707,10 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh } } else { - myHolder.add(HighlightNamesUtil.highlightMethodName(method, element, false, colorsScheme)); + final PsiElement referenceNameElement = element.getReferenceNameElement(); + if(referenceNameElement != null) { + myHolder.add(HighlightNamesUtil.highlightMethodName(method, referenceNameElement, false, colorsScheme)); + } } } catch (IndexNotReadyException ignored) { From 0d56efcdf295f2fa279f8cacc5ffc6d7910a1f0e Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Thu, 7 Mar 2013 10:53:06 +0400 Subject: [PATCH 05/57] EA-44612 - don't suggest to covnert method call to property access if it contains errors --- .../style/JavaStylePropertiesInvocationIntention.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/JavaStylePropertiesInvocationIntention.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/JavaStylePropertiesInvocationIntention.java index 1e26f828be24..10b3b40ba281 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/JavaStylePropertiesInvocationIntention.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/JavaStylePropertiesInvocationIntention.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2013 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. @@ -21,6 +21,7 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.groovy.intentions.base.ErrorUtil; import org.jetbrains.plugins.groovy.intentions.base.Intention; import org.jetbrains.plugins.groovy.intentions.base.PsiElementPredicate; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; @@ -48,7 +49,7 @@ public class JavaStylePropertiesInvocationIntention extends Intention { protected PsiElementPredicate getElementPredicate() { return new PsiElementPredicate() { public boolean satisfiedBy(PsiElement element) { - return element instanceof GrMethodCall && isPropertyAccessor((GrMethodCall)element); + return element instanceof GrMethodCall && isPropertyAccessor((GrMethodCall)element) && !ErrorUtil.containsError(element); } }; } From 51323bd23d4236d9d9f1560e436897051387ff77 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Thu, 7 Mar 2013 11:48:33 +0400 Subject: [PATCH 06/57] EA-44573 - more correct conflict searching --- .../GroovyRefactoringBundle.properties | 1 + .../inline/GroovyMethodInliner.java | 6 ++- .../inline/InlineMethodTest.groovy | 44 ++++++++++++------- .../inlineMethod/cannotInlineMethodRef.test | 7 +++ 4 files changed, 41 insertions(+), 17 deletions(-) create mode 100644 plugins/groovy/testdata/groovy/refactoring/inlineMethod/cannotInlineMethodRef.test diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyRefactoringBundle.properties b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyRefactoringBundle.properties index af474f9692a3..8663a38115da 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyRefactoringBundle.properties +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyRefactoringBundle.properties @@ -173,3 +173,4 @@ rename.groovy.method=Rename Groovy method cannot.inline.0.=Cannot inline {0} ref.0.will.not.be.resolved.outside.of.current.context=Reference ''{0}'' will not be resolved outside of current context cannot.rename.property.0=Cannot rename property ''{0}'' which overrides method ''{1}'' +cannot.inline.reference.0=Cannot inline reference ''{0}'' diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyMethodInliner.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyMethodInliner.java index 2c12c6827eb0..326b0ccbe3e3 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyMethodInliner.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyMethodInliner.java @@ -82,7 +82,11 @@ public class GroovyMethodInliner implements InlineHandler.Inliner { @Nullable public MultiMap getConflicts(@NotNull PsiReference reference, @NotNull PsiElement referenced) { PsiElement element = reference.getElement(); - assert element instanceof GrExpression && element.getParent() instanceof GrCallExpression; + if (!(element instanceof GrExpression && element.getParent() instanceof GrCallExpression)) { + final MultiMap map = new MultiMap(); + map.putValue(element, GroovyRefactoringBundle.message("cannot.inline.reference.0", element.getText())); + return map; + } GrCallExpression call = (GrCallExpression) element.getParent(); Collection infos = GroovyInlineMethodUtil.collectReferenceInfo(myMethod); return collectConflicts(call, infos); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/inline/InlineMethodTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/inline/InlineMethodTest.groovy index acbafa991c33..b3153d178b5a 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/inline/InlineMethodTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/inline/InlineMethodTest.groovy @@ -23,6 +23,7 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.psi.impl.source.codeStyle.CodeEditUtil import com.intellij.psi.impl.source.tree.TreeElement +import com.intellij.refactoring.BaseRefactoringProcessor import com.intellij.refactoring.inline.GenericInlineHandler import com.intellij.refactoring.util.CommonRefactoringUtil import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture @@ -106,20 +107,31 @@ public class InlineMethodTest extends LightCodeInsightFixtureTestCase { public void testBadReturns() { doTest() } public void testInlineAll() { + doInlineAllTest() + } + + private void doInlineAllTest() { doTest(new GroovyInlineHandler() { @Override public InlineHandler.Settings prepareInlineElement(PsiElement element, Editor editor, boolean invokedOnReference) { - return new InlineHandler.Settings() { - @Override - boolean isOnlyOneReferenceToInline() {false} - } + return { false } as InlineHandler.Settings } }) } - + public void testInlineNamedArgs() {doTest(); } public void testInlineVarargs() {doTest()} + public void testCannotInlineMethodRef() { + try { + doInlineAllTest() + assert false + } + catch (BaseRefactoringProcessor.ConflictsInTestsException e) { + assertEquals("Cannot inline reference 'new A().&foo'", e.message) + } + } + protected void doTest() { doTest(new GroovyInlineHandler()); } @@ -145,19 +157,19 @@ public class InlineMethodTest extends LightCodeInsightFixtureTestCase { GroovyPsiElement selectedArea = GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, GrReferenceExpression.class); if (selectedArea == null) { - PsiElement identifier = GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, PsiElement.class); - if (identifier != null) { - if (identifier.parent instanceof GrVariable) { - selectedArea = (GroovyPsiElement)identifier.parent; - } - else if (identifier instanceof GrMethod) { - selectedArea = identifier - } - else { - this.assertTrue("Selected area doesn't point to method or variable", false) + PsiElement identifier = GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, PsiElement.class); + if (identifier != null) { + if (identifier.parent instanceof GrVariable) { + selectedArea = (GroovyPsiElement)identifier.parent; + } + else if (identifier instanceof GrMethod) { + selectedArea = identifier + } + else { + this.assertTrue("Selected area doesn't point to method or variable", false) + } } } - } Assert.assertNotNull("Selected area reference points to nothing", selectedArea); PsiElement element = selectedArea instanceof GrExpression ? selectedArea.reference.resolve() : selectedArea; Assert.assertNotNull("Cannot resolve selected reference expression", element); diff --git a/plugins/groovy/testdata/groovy/refactoring/inlineMethod/cannotInlineMethodRef.test b/plugins/groovy/testdata/groovy/refactoring/inlineMethod/cannotInlineMethodRef.test new file mode 100644 index 000000000000..d6469cc188ea --- /dev/null +++ b/plugins/groovy/testdata/groovy/refactoring/inlineMethod/cannotInlineMethodRef.test @@ -0,0 +1,7 @@ +class A { + def foo() {} +} + +new A().foo() +new A().&foo +----- From 5abc7a4b14d70a5e8be87eb6c07a71992406d9a1 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Thu, 7 Mar 2013 15:11:01 +0400 Subject: [PATCH 07/57] fix intention before/after templates --- .../GrBreakStringOnLineBreaksIntention/after.groovy.template | 5 ++--- .../before.groovy.template | 4 +--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/plugins/groovy/resources/intentionDescriptions/GrBreakStringOnLineBreaksIntention/after.groovy.template b/plugins/groovy/resources/intentionDescriptions/GrBreakStringOnLineBreaksIntention/after.groovy.template index a30765f6a90a..aca22e95f99b 100644 --- a/plugins/groovy/resources/intentionDescriptions/GrBreakStringOnLineBreaksIntention/after.groovy.template +++ b/plugins/groovy/resources/intentionDescriptions/GrBreakStringOnLineBreaksIntention/after.groovy.template @@ -1,3 +1,2 @@ -def ArrayList getDigits() { - return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] -} \ No newline at end of file +print 'first line\n' + + 'second line' \ No newline at end of file diff --git a/plugins/groovy/resources/intentionDescriptions/GrBreakStringOnLineBreaksIntention/before.groovy.template b/plugins/groovy/resources/intentionDescriptions/GrBreakStringOnLineBreaksIntention/before.groovy.template index a4d2f148943b..4bfcc8b50edb 100644 --- a/plugins/groovy/resources/intentionDescriptions/GrBreakStringOnLineBreaksIntention/before.groovy.template +++ b/plugins/groovy/resources/intentionDescriptions/GrBreakStringOnLineBreaksIntention/before.groovy.template @@ -1,3 +1 @@ -def getDigits() { - return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] -} \ No newline at end of file +print 'first line\nsecond line' \ No newline at end of file From 07db8a695a9a46c1ef18a6e92ea2e9ce07094944 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Thu, 7 Mar 2013 17:24:39 +0400 Subject: [PATCH 08/57] Gdsl: use List instead of Set --- .../groovy/dsl/CustomMembersGenerator.java | 2 +- .../dsl/holders/NonCodeMembersHolder.java | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/CustomMembersGenerator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/CustomMembersGenerator.java index 85f0c12e0b08..63806a577a06 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/CustomMembersGenerator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/CustomMembersGenerator.java @@ -53,7 +53,7 @@ public class CustomMembersGenerator extends GroovyObjectSupport implements GdslM private static final Logger LOG = Logger.getInstance("#org.jetbrains.plugins.groovy.dsl.CustomMembersGenerator"); private static final GdslMembersProvider[] PROVIDERS = GdslMembersProvider.EP_NAME.getExtensions(); public static final String THROWS = "throws"; - private final Set myDeclarations = new HashSet(); + private final List myDeclarations = ContainerUtil.newArrayList(); private final Project myProject; private final CompoundMembersHolder myDepot = new CompoundMembersHolder(); private final GroovyClassDescriptor myDescriptor; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/holders/NonCodeMembersHolder.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/holders/NonCodeMembersHolder.java index 51c96c69961f..df3609da7ba0 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/holders/NonCodeMembersHolder.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/holders/NonCodeMembersHolder.java @@ -31,7 +31,10 @@ import org.jetbrains.plugins.groovy.lang.completion.closureParameters.ClosureDes import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightMethodBuilder; import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightVariable; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; /** * @author peter @@ -41,11 +44,11 @@ public class NonCodeMembersHolder implements CustomMembersHolder { public static final Key DOCUMENTATION_URL = Key.create("GdslDocumentationUrl"); private final List myDeclarations = new ArrayList(); - public static NonCodeMembersHolder generateMembers(Set methods, final PsiFile place) { - Map, NonCodeMembersHolder> map = CachedValuesManager.getManager(place.getProject()).getCachedValue( - place, new CachedValueProvider, NonCodeMembersHolder>>() { - public Result, NonCodeMembersHolder>> compute() { - final Map, NonCodeMembersHolder> map = new ConcurrentSoftHashMap, NonCodeMembersHolder>(); + public static NonCodeMembersHolder generateMembers(List methods, final PsiFile place) { + Map, NonCodeMembersHolder> map = CachedValuesManager.getManager(place.getProject()).getCachedValue( + place, new CachedValueProvider, NonCodeMembersHolder>>() { + public Result, NonCodeMembersHolder>> compute() { + final Map, NonCodeMembersHolder> map = new ConcurrentSoftHashMap, NonCodeMembersHolder>(); return Result.create(map, PsiModificationTracker.MODIFICATION_COUNT); } }); @@ -57,7 +60,7 @@ public class NonCodeMembersHolder implements CustomMembersHolder { return result; } - private NonCodeMembersHolder(Set data, PsiElement place) { + private NonCodeMembersHolder(List data, PsiElement place) { final PsiManager manager = place.getManager(); for (Map prop : data) { final Object decltype = prop.get("declarationType"); @@ -78,7 +81,7 @@ public class NonCodeMembersHolder implements CustomMembersHolder { } } - private PsiElement createVariable(Map prop, PsiElement place, PsiManager manager) { + private static PsiElement createVariable(Map prop, PsiElement place, PsiManager manager) { String name = String.valueOf(prop.get("name")); final String type = String.valueOf(prop.get("type")); return new GrLightVariable(manager, name, type, Collections.emptyList(), place.getContainingFile()); From 40492aa2b927d515eba9f4ef62369a8cd5429ee7 Mon Sep 17 00:00:00 2001 From: Rustam Vishnyakov Date: Thu, 7 Mar 2013 17:35:30 +0400 Subject: [PATCH 09/57] Fixed version of Vibrant Ink with default colors --- colorSchemes/src/colorSchemes/vibrant_ink.xml | 622 +++++++++--------- 1 file changed, 323 insertions(+), 299 deletions(-) diff --git a/colorSchemes/src/colorSchemes/vibrant_ink.xml b/colorSchemes/src/colorSchemes/vibrant_ink.xml index 5317b6ccb193..e8e73e74fb95 100644 --- a/colorSchemes/src/colorSchemes/vibrant_ink.xml +++ b/colorSchemes/src/colorSchemes/vibrant_ink.xml @@ -1,31 +1,32 @@ - + + @@ -387,13 +388,13 @@ @@ -404,7 +405,7 @@ @@ -416,12 +417,12 @@ + + + + + + + + + + + + + + + + + + + @@ -539,8 +639,8 @@ + @@ -786,7 +889,7 @@ - - - - @@ -907,52 +990,14 @@ - - - - - - - - @@ -976,71 +1016,55 @@ - - - @@ -1971,18 +1995,18 @@ @@ -2012,12 +2036,12 @@ From b632bd601c9832cc1e662add75ebc6e60db736ee Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Thu, 7 Mar 2013 17:49:19 +0400 Subject: [PATCH 10/57] XmlLanguageInjector: do not create Patterns for empty regex --- .../intelliLang/inject/xml/XmlLanguageInjector.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/IntelliLang/xml-support/org/intellij/plugins/intelliLang/inject/xml/XmlLanguageInjector.java b/plugins/IntelliLang/xml-support/org/intellij/plugins/intelliLang/inject/xml/XmlLanguageInjector.java index 78d443bd4773..a05a24426dc9 100644 --- a/plugins/IntelliLang/xml-support/org/intellij/plugins/intelliLang/inject/xml/XmlLanguageInjector.java +++ b/plugins/IntelliLang/xml-support/org/intellij/plugins/intelliLang/inject/xml/XmlLanguageInjector.java @@ -41,6 +41,7 @@ import org.intellij.plugins.intelliLang.inject.config.AbstractTagInjection; import org.intellij.plugins.intelliLang.inject.config.BaseInjection; import org.intellij.plugins.intelliLang.inject.config.InjectionPlace; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.regex.Pattern; @@ -227,8 +228,8 @@ public final class XmlLanguageInjector implements MultiHostInjector { private static boolean areThereInjectionsWithText(final String text, Trinity> index) { if (text == null) return false; if (index.third.contains(text)) return true; - if (index.second.matcher(text).matches()) return true; - return false; + Pattern pattern = index.second; + return pattern != null && pattern.matcher(text).matches(); } private Trinity> getXmlAnnotatedElementsValue() { @@ -248,6 +249,7 @@ public final class XmlLanguageInjector implements MultiHostInjector { return index; } + @Nullable private static Pattern buildPattern(Collection stringSet) { final StringBuilder sb = new StringBuilder(); for (String s : stringSet) { @@ -255,7 +257,7 @@ public final class XmlLanguageInjector implements MultiHostInjector { if (sb.length() > 0) sb.append('|'); sb.append("(?:").append(s).append(")"); } - return Pattern.compile(sb.toString()); + return sb.length() == 0 ? null : Pattern.compile(sb.toString()); } } From 58aabb2002ccd2e2526619a5e53399bf7ab731ce Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Thu, 7 Mar 2013 17:55:10 +0400 Subject: [PATCH 11/57] SOF: more logging --- .../plugins/groovy/lang/resolve/ResolveUtil.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java index e3b06dde8174..113b85672dc0 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java @@ -16,6 +16,8 @@ package org.jetbrains.plugins.groovy.lang.resolve; +import com.intellij.diagnostic.LogMessageEx; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Key; @@ -83,6 +85,8 @@ import static org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil.getSmartReturnT */ @SuppressWarnings({"StringBufferReplaceableByString"}) public class ResolveUtil { + private static final Logger LOG = Logger.getInstance(ResolveUtil.class); + public static final PsiScopeProcessor.Event DECLARATION_SCOPE_PASSED = new PsiScopeProcessor.Event() {}; private ResolveUtil() { @@ -114,6 +118,7 @@ public class ResolveUtil { @NotNull final PsiScopeProcessor processor, boolean processNonCodeMethods, @NotNull final ResolveState state) { + try { ClassHint hint = processor.getHint(ClassHint.KEY); if (hint != null) { return new DeclarationCacheKey(getNameHint(processor), hint, processNonCodeMethods, originalPlace).processCachedDeclarations(place, processor); @@ -131,6 +136,11 @@ public class ResolveUtil { return true; } }); + } + catch (StackOverflowError e) { + LogMessageEx.error(LOG, "StackOverflow", e, place.getContainingFile().getText()); + throw e; + } } static boolean doProcessDeclarations(@NotNull PsiElement place, From 0b42f9eb19c5e0ce8a847e263773ab231ee51462 Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Thu, 7 Mar 2013 18:09:06 +0400 Subject: [PATCH 12/57] assertion removed including OC-6657 fix --- .../src/com/intellij/psi/impl/file/impl/PsiVFSListener.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java b/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java index e507b5c9824e..38aa026210fa 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java @@ -320,7 +320,9 @@ public class PsiVFSListener extends VirtualFileAdapter { myFileManager.setViewProvider(vFile, viewProvider); PsiFile newPsiFile = myManager.findFile(vFile); if (newPsiFile == null) { - LOG.error("null psi file for "+vFile+"; provider: "+viewProvider); + // psi file here can be null for any custom file with null parent + // that is currently open in a file editor, e.g. db table editor + //LOG.error("null psi file for "+vFile+"; provider: "+viewProvider); return; } if (!viewProvider.isPhysical()) { From ca0e032bb1a73a5c4c1e979d85042c95e509add7 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Thu, 7 Mar 2013 18:18:17 +0400 Subject: [PATCH 13/57] skip importing task if no natures were found --- .../idea/eclipse/importWizard/EclipseImportBuilder.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseImportBuilder.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseImportBuilder.java index 61618146bdab..06d1bfe26509 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseImportBuilder.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseImportBuilder.java @@ -299,8 +299,11 @@ public class EclipseImportBuilder extends ProjectImportBuilder implement final Module module = moduleModel.newModule(modulesDirectory + "/" + EclipseProjectFinder.findProjectName(path) + IdeaXml.IML_EXT, StdModuleTypes.JAVA.getId()); result.add(module); - module2NatureNames.put(module, collectNatures(path)); + final Set natures = collectNatures(path); + if (natures.size() > 0) { + module2NatureNames.put(module, natures); + } final ModifiableRootModel rootModel = ModuleRootManager.getInstance(module).getModifiableModel(); rootModels[idx++] = rootModel; @@ -407,6 +410,9 @@ public class EclipseImportBuilder extends ProjectImportBuilder implement private static void scheduleNaturesImporting(@NotNull final Project project, @NotNull final Map> module2NatureNames) { + if (module2NatureNames.size() == 0) { + return; + } ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { From 6ca4f0d635da70866df5aba55909dbb7adc73058 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 7 Mar 2013 15:17:47 +0100 Subject: [PATCH 14/57] move stub safeGet to a place visible to more clients --- .../src/com/intellij/psi/stubs/StubIndex.java | 34 ++++++++++++++++++- .../com/intellij/psi/stubs/StubIndexImpl.java | 23 ------------- .../impl/GroovyDirectInheritorsSearcher.java | 3 +- .../lang/stubs/GroovyShortNamesCache.java | 5 ++- 4 files changed, 36 insertions(+), 29 deletions(-) diff --git a/platform/indexing-api/src/com/intellij/psi/stubs/StubIndex.java b/platform/indexing-api/src/com/intellij/psi/stubs/StubIndex.java index 1aca7059ab7e..94ef678ed8ec 100644 --- a/platform/indexing-api/src/com/intellij/psi/stubs/StubIndex.java +++ b/platform/indexing-api/src/com/intellij/psi/stubs/StubIndex.java @@ -20,19 +20,25 @@ package com.intellij.psi.stubs; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.Processor; +import com.intellij.util.indexing.FileBasedIndex; import org.jetbrains.annotations.NotNull; import java.util.Collection; +import java.util.Iterator; public abstract class StubIndex { + private static final Logger LOG = Logger.getInstance("#com.intellij.psi.stubs.StubIndex"); + private static class StubIndexHolder { private static final StubIndex ourInstance = ApplicationManager.getApplication().getComponent(StubIndex.class); } - public static StubIndex getInstance() { return StubIndexHolder.ourInstance; } @@ -50,4 +56,30 @@ public abstract class StubIndex { @NotNull public abstract Collection getAllKeys(@NotNull StubIndexKey indexKey, @NotNull Project project); + + public Collection safeGet(@NotNull StubIndexKey indexKey, + @NotNull Key key, + @NotNull final Project project, + final GlobalSearchScope scope, + @NotNull Class requiredClass) { + Collection collection = getInstance().get(indexKey, key, project, scope); + for (Iterator iterator = collection.iterator(); iterator.hasNext(); ) { + Psi psi = iterator.next(); + if (!requiredClass.isInstance(psi)) { + iterator.remove(); + reportStubPsiMismatch(psi); + } + } + + return collection; + } + + protected void reportStubPsiMismatch(Psi psi) { + VirtualFile faultyContainer = PsiUtilCore.getVirtualFile(psi); + LOG.error("Invalid stub element type in index: " + faultyContainer + ". found: " + psi); + if (faultyContainer != null && faultyContainer.isValid()) { + FileBasedIndex.getInstance().requestReindex(faultyContainer); + } + } + } diff --git a/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java b/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java index 530a40b3caad..3a46be258d30 100644 --- a/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java @@ -31,7 +31,6 @@ import com.intellij.openapi.vfs.newvfs.persistent.PersistentFS; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiManager; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.CommonProcessors; import com.intellij.util.Processor; import com.intellij.util.SmartList; @@ -397,26 +396,4 @@ public class StubIndexImpl extends StubIndex implements ApplicationComponent, Pe } } - public static Collection safeGet(@NotNull StubIndexKey indexKey, - @NotNull Key key, - @NotNull final Project project, - final GlobalSearchScope scope, - @NotNull Class requiredClass) { - Collection collection = getInstance().get(indexKey, key, project, scope); - for (Iterator iterator = collection.iterator(); iterator.hasNext(); ) { - Psi psi = iterator.next(); - if (!requiredClass.isInstance(psi)) { - iterator.remove(); - - VirtualFile faultyContainer = PsiUtilCore.getVirtualFile(psi); - LOG.error("Invalid stub element type in index: " + faultyContainer + ". found: " + psi); - if (faultyContainer != null && faultyContainer.isValid()) { - FileBasedIndex.getInstance().requestReindex(faultyContainer); - } - } - } - - return collection; - } - } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyDirectInheritorsSearcher.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyDirectInheritorsSearcher.java index b35eb881a4bd..36f239b74975 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyDirectInheritorsSearcher.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyDirectInheritorsSearcher.java @@ -24,7 +24,6 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.searches.DirectClassInheritorsSearch; import com.intellij.psi.stubs.StubIndex; -import com.intellij.psi.stubs.StubIndexImpl; import com.intellij.util.Processor; import com.intellij.util.QueryExecutor; import org.jetbrains.annotations.NotNull; @@ -51,7 +50,7 @@ class GroovyDirectInheritorsSearcher implements QueryExecutor inheritors = new ArrayList(); - for (GrReferenceList list : StubIndexImpl.safeGet(GrDirectInheritorsIndex.KEY, name, clazz.getProject(), scope, + for (GrReferenceList list : StubIndex.getInstance().safeGet(GrDirectInheritorsIndex.KEY, name, clazz.getProject(), scope, GrReferenceList.class)) { final PsiElement parent = list.getParent(); if (parent instanceof GrTypeDefinition) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/stubs/GroovyShortNamesCache.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/stubs/GroovyShortNamesCache.java index 4e1d21d756fa..7198f2a1ba47 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/stubs/GroovyShortNamesCache.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/stubs/GroovyShortNamesCache.java @@ -24,7 +24,6 @@ import com.intellij.psi.PsiMethod; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.PsiShortNamesCache; import com.intellij.psi.stubs.StubIndex; -import com.intellij.psi.stubs.StubIndexImpl; import com.intellij.util.ArrayUtil; import com.intellij.util.ObjectUtils; import com.intellij.util.Processor; @@ -97,8 +96,8 @@ public class GroovyShortNamesCache extends PsiShortNamesCache { private List addClasses(String name, GlobalSearchScope scope, boolean inSource) { final List result = new ArrayList(getScriptClassesByFQName(name, scope, inSource)); - for (PsiElement psiClass : StubIndexImpl.safeGet(GrFullClassNameIndex.KEY, name.hashCode(), myProject, - inSource ? new GrSourceFilterScope(scope) : scope, PsiClass.class)) { + for (PsiElement psiClass : StubIndex.getInstance().safeGet(GrFullClassNameIndex.KEY, name.hashCode(), myProject, + inSource ? new GrSourceFilterScope(scope) : scope, PsiClass.class)) { //hashcode doesn't guarantee equals if (name.equals(((PsiClass)psiClass).getQualifiedName())) { result.add((PsiClass)psiClass); From d5d85295ae09ff2cf931f3e01a6a5e8d66784c22 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 7 Mar 2013 15:17:58 +0100 Subject: [PATCH 15/57] use safeGet in annotated searcher, use less read actions there (IDEA-102588) --- .../java/stubs/index/JavaAnnotationIndex.java | 4 +- .../search/AnnotatedElementsSearcher.java | 91 ++++++------------- 2 files changed, 32 insertions(+), 63 deletions(-) diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnnotationIndex.java b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnnotationIndex.java index fbf4508682b3..03c8c3e2e1f3 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnnotationIndex.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnnotationIndex.java @@ -24,7 +24,9 @@ import com.intellij.psi.PsiAnnotation; import com.intellij.psi.impl.search.JavaSourceFilterScope; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.stubs.StringStubIndexExtension; +import com.intellij.psi.stubs.StubIndex; import com.intellij.psi.stubs.StubIndexKey; +import com.intellij.psi.stubs.StubProcessingHelperBase; import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -44,6 +46,6 @@ public class JavaAnnotationIndex extends StringStubIndexExtension @Override public Collection get(final String s, final Project project, @NotNull final GlobalSearchScope scope) { - return super.get(s, project, new JavaSourceFilterScope(scope)); + return StubIndex.getInstance().safeGet(getKey(), s, project, new JavaSourceFilterScope(scope), PsiAnnotation.class); } } \ No newline at end of file diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/AnnotatedElementsSearcher.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/AnnotatedElementsSearcher.java index a4aa95266d53..cc0ac6d48761 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/AnnotatedElementsSearcher.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/AnnotatedElementsSearcher.java @@ -3,7 +3,6 @@ package com.intellij.psi.impl.search; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Computable; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.impl.PsiManagerImpl; import com.intellij.psi.impl.java.stubs.index.JavaAnnotationIndex; @@ -11,13 +10,12 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.searches.AnnotatedElementsSearch; -import com.intellij.psi.util.PsiUtilCore; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.Processor; import com.intellij.util.QueryExecutor; -import com.intellij.util.indexing.FileBasedIndex; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -43,46 +41,32 @@ public class AnnotatedElementsSearcher implements QueryExecutor[] types = p.getTypes(); + final Class[] types = p.getTypes(); - for (PsiElement elt : getAnnotationCandidates(annClass, useScope)) { - if (notAnnotation(elt)) continue; - - final PsiAnnotation ann = (PsiAnnotation)elt; - final PsiJavaCodeReferenceElement ref = ApplicationManager.getApplication().runReadAction(new Computable() { + for (final PsiAnnotation ann : getAnnotationCandidates(annClass, useScope)) { + final PsiModifierListOwner candidate = ApplicationManager.getApplication().runReadAction(new Computable() { @Override - public PsiJavaCodeReferenceElement compute() { - return ann.getNameReferenceElement(); + public PsiModifierListOwner compute() { + PsiElement parent = ann.getParent(); + if (!(parent instanceof PsiModifierList)) { + return null; // Can be a PsiNameValuePair, if annotation is used to annotate annotation parameters + } + + final PsiElement owner = parent.getParent(); + if (!isInstanceof(owner, types)) { + return null; + } + + final PsiJavaCodeReferenceElement ref = ann.getNameReferenceElement(); + if (ref == null || !psiManager.areElementsEquivalent(ref.resolve(), annClass)) { + return null; + } + + return (PsiModifierListOwner)owner; } }); - if (ref == null) continue; - PsiElement parent = ann.getParent(); - if (!(parent instanceof PsiModifierList)) continue; // Can be a PsiNameValuePair, if annotation is used to annotate annotation parameters - - final PsiElement owner = parent.getParent(); - - if (!isInstanceof(owner, types)) continue; - - final PsiModifierListOwner candidate = (PsiModifierListOwner)owner; - - if (!ApplicationManager.getApplication().runReadAction(new Computable() { - @Override - public Boolean compute() { - if (!candidate.isValid()) { - return false; - } - if (!psiManager.areElementsEquivalent(ref.resolve(), annClass)) { - return false; - } - return !(useScope instanceof GlobalSearchScope) || - ((GlobalSearchScope)useScope).contains(candidate.getContainingFile().getVirtualFile()); - } - })) { - continue; - } - - if (!consumer.process(candidate)) { + if (candidate != null && !consumer.process(candidate)) { return false; } } @@ -90,23 +74,17 @@ public class AnnotatedElementsSearcher implements QueryExecutor getAnnotationCandidates(final PsiClass annClass, final SearchScope useScope) { - return ApplicationManager.getApplication().runReadAction(new Computable>() { + private static Collection getAnnotationCandidates(final PsiClass annClass, final SearchScope useScope) { + return ApplicationManager.getApplication().runReadAction(new Computable>() { @Override - public Collection compute() { + public Collection compute() { if (useScope instanceof GlobalSearchScope) { return JavaAnnotationIndex.getInstance().get(annClass.getName(), annClass.getProject(), (GlobalSearchScope)useScope); } - final List result = new ArrayList(); + + final List result = ContainerUtil.newArrayList(); for (PsiElement element : ((LocalSearchScope)useScope).getScope()) { - element.accept(new PsiRecursiveElementWalkingVisitor() { - @Override - public void visitElement(PsiElement element) { - if (element instanceof PsiAnnotation) { - result.add(element); - } - } - }); + result.addAll(PsiTreeUtil.findChildrenOfType(element, PsiAnnotation.class)); } return result; } @@ -120,15 +98,4 @@ public class AnnotatedElementsSearcher implements QueryExecutor Date: Thu, 7 Mar 2013 15:29:05 +0100 Subject: [PATCH 16/57] some diagnostics for invalid stubs in StubIndex.safeGet (IDEA-102588) --- .../src/com/intellij/psi/stubs/StubIndex.java | 16 +++++----- .../com/intellij/psi/stubs/StubIndexImpl.java | 31 +++++++++++++++++++ 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/platform/indexing-api/src/com/intellij/psi/stubs/StubIndex.java b/platform/indexing-api/src/com/intellij/psi/stubs/StubIndex.java index 94ef678ed8ec..c3100e8501c5 100644 --- a/platform/indexing-api/src/com/intellij/psi/stubs/StubIndex.java +++ b/platform/indexing-api/src/com/intellij/psi/stubs/StubIndex.java @@ -67,19 +67,21 @@ public abstract class StubIndex { Psi psi = iterator.next(); if (!requiredClass.isInstance(psi)) { iterator.remove(); - reportStubPsiMismatch(psi); + + VirtualFile faultyContainer = PsiUtilCore.getVirtualFile(psi); + if (faultyContainer != null && faultyContainer.isValid()) { + FileBasedIndex.getInstance().requestReindex(faultyContainer); + } + + reportStubPsiMismatch(psi, faultyContainer); } } return collection; } - protected void reportStubPsiMismatch(Psi psi) { - VirtualFile faultyContainer = PsiUtilCore.getVirtualFile(psi); - LOG.error("Invalid stub element type in index: " + faultyContainer + ". found: " + psi); - if (faultyContainer != null && faultyContainer.isValid()) { - FileBasedIndex.getInstance().requestReindex(faultyContainer); - } + protected void reportStubPsiMismatch(Psi psi, VirtualFile file) { + LOG.error("Invalid stub element type in index: " + file + ". found: " + psi); } } diff --git a/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java b/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java index 3a46be258d30..7eeee210443a 100644 --- a/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java @@ -22,15 +22,20 @@ package com.intellij.psi.stubs; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.*; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.newvfs.ManagingFS; import com.intellij.openapi.vfs.newvfs.persistent.PersistentFS; +import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.CommonProcessors; import com.intellij.util.Processor; import com.intellij.util.SmartList; @@ -396,4 +401,30 @@ public class StubIndexImpl extends StubIndex implements ApplicationComponent, Pe } } + @Override + protected void reportStubPsiMismatch(Psi psi, VirtualFile file) { + VirtualFile faultyContainer = PsiUtilCore.getVirtualFile(psi); + if (faultyContainer != null) { + Document document = FileDocumentManager.getInstance().getDocument(file); + PsiFile psiFile = psi.getManager().findFile(file); + + String msg = "Invalid stub element type in index: " + file; + msg += "; found: " + psi; + msg += "; file stamp: " + file.getModificationStamp(); + msg += "; file modCount: " + file.getModificationCount(); + if (document != null) { + msg += "; unsaved: " + FileDocumentManager.getInstance().isDocumentUnsaved(document); + msg += "; doc stamp: " + document.getModificationStamp(); + msg += "; committed: " + PsiDocumentManager.getInstance(psi.getProject()).isCommitted(document); + } + if (psiFile != null) { + msg += "; psi stamp: " + psiFile.getModificationStamp(); + msg += "; viewProvider stamp: " + psiFile.getViewProvider().getModificationStamp(); + } + LOG.error(msg); + return; + } + super.reportStubPsiMismatch(psi, file); + + } } From e68f79a45bcb80bf1a96b99ee600164954682487 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 7 Mar 2013 15:41:06 +0100 Subject: [PATCH 17/57] javafx: color completion/navigation/gutter (IDEA-101338) --- .../javaFX/fxml/JavaFXHighlightingTest.java | 4 ++ .../javaFX/fxml/JavaFxCompletionTest.java | 4 ++ .../javaFX/fxml/JavaFxCommonClassNames.java | 1 + .../fxml/refs/FxmlReferencesContributor.java | 3 + .../javaFX/fxml/refs/JavaFxAnnotator.java | 46 +++++-------- .../fxml/refs/JavaFxColorReference.java | 69 +++++++++++++++++++ .../refs/JavaFxColorReferenceProvider.java | 55 +++++++++++++++ .../testData/completion/namedColors.fxml | 5 ++ .../completion/namedColors_after.fxml | 5 ++ .../testData/highlighting/namedColor.fxml | 5 ++ 10 files changed, 169 insertions(+), 28 deletions(-) create mode 100644 plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxColorReference.java create mode 100644 plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxColorReferenceProvider.java create mode 100644 plugins/javaFX/testData/completion/namedColors.fxml create mode 100644 plugins/javaFX/testData/completion/namedColors_after.fxml create mode 100644 plugins/javaFX/testData/highlighting/namedColor.fxml diff --git a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXHighlightingTest.java b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXHighlightingTest.java index 3ec2a6385bb2..ce2b38cd128b 100644 --- a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXHighlightingTest.java +++ b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXHighlightingTest.java @@ -136,6 +136,10 @@ public class JavaFXHighlightingTest extends DaemonAnalyzerTestCase { doTestNavigation("MyController", "label", "injected/" + getTestName(true) + ".fxml", "injected/FooVBox.java", "injected/MyController.java"); } + public void testNamedColor() throws Exception { + doTestNavigation(JavaFxCommonClassNames.JAVAFX_SCENE_COLOR, "ORANGE"); + } + private void doTestNavigation(String resultClassName, String resultFieldName) throws Exception { doTestNavigation(resultClassName, resultFieldName, ArrayUtil.EMPTY_STRING_ARRAY); } diff --git a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCompletionTest.java b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCompletionTest.java index 296b93dd2ee7..199c3d2fa739 100644 --- a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCompletionTest.java +++ b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCompletionTest.java @@ -109,6 +109,10 @@ public class JavaFxCompletionTest extends CompletionTestCase { doTest("stylesheets"); } + public void testNamedColors() throws Exception { + doTest("blue"); + } + public void testReadOnly() throws Exception { configureByFile(getTestName(true) + ".fxml"); assertTrue(myItems.length > 0); diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxCommonClassNames.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxCommonClassNames.java index 51f104370393..5e03303fb3eb 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxCommonClassNames.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxCommonClassNames.java @@ -35,6 +35,7 @@ public class JavaFxCommonClassNames { @NonNls public static final String JAVAFX_EVENT_EVENT_HANDLER = "javafx.event.EventHandler"; @NonNls public static final String JAVAFX_SCENE_NODE = "javafx.scene.Node"; @NonNls public static final String JAVAFX_SCENE_PAINT = "javafx.scene.paint.Paint"; + @NonNls public static final String JAVAFX_SCENE_COLOR = "javafx.scene.paint.Color"; @NonNls public static final String JAVAFX_FXML_BUILDER = "javafx.util.Builder"; @NonNls public static final String JAVAFX_BEANS_OBSERVABLE = "javafx.beans.Observable"; @NonNls public static final String VALUE_OF = "valueOf"; diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/FxmlReferencesContributor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/FxmlReferencesContributor.java index febd08f873ab..787a274c9230 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/FxmlReferencesContributor.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/FxmlReferencesContributor.java @@ -100,6 +100,9 @@ public class FxmlReferencesContributor extends PsiReferenceContributor { registrar.registerReferenceProvider(XmlPatterns.xmlAttributeValue().and(attributeValueInFxml), new EnumeratedAttributeReferenceProvider()); + registrar.registerReferenceProvider(XmlPatterns.xmlAttributeValue().and(attributeValueInFxml), + new JavaFxColorReferenceProvider()); + registrar.registerReferenceProvider(XmlPatterns.xmlAttributeValue() .withParent(XmlPatterns.xmlAttribute().withName(FxmlConstants.FX_VALUE) .withParent(XmlPatterns.xmlTag().withParent(XmlPatterns.xmlTag().withName(FxmlConstants.STYLESHEETS)))) diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxAnnotator.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxAnnotator.java index 9da83e9eee7a..2670e4d928e4 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxAnnotator.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxAnnotator.java @@ -28,19 +28,17 @@ import com.intellij.openapi.editor.markup.GutterIconRenderer; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.presentation.java.SymbolPresentationUtil; -import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlAttributeValue; import com.intellij.ui.ColorUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.ui.ColorIcon; -import com.intellij.xml.XmlAttributeDescriptor; +import com.intellij.xml.util.ColorSampleLookupValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.javaFX.fxml.FxmlConstants; import org.jetbrains.plugins.javaFX.fxml.JavaFxCommonClassNames; import org.jetbrains.plugins.javaFX.fxml.JavaFxFileTypeFactory; import org.jetbrains.plugins.javaFX.fxml.JavaFxPsiUtil; -import org.jetbrains.plugins.javaFX.fxml.descriptors.JavaFxPropertyAttributeDescriptor; import javax.swing.*; import java.awt.*; @@ -70,11 +68,8 @@ public class JavaFxAnnotator implements Annotator { } } } - if (references.length == 0) { - final String attributeValueText = StringUtil.stripQuotesAroundValue(element.getText()); - if (attributeValueText.startsWith("#")) { - attachColorIcon(element, holder, attributeValueText); - } + if (references.length == 1 && references[0] instanceof JavaFxColorReference) { + attachColorIcon(element, holder, StringUtil.stripQuotesAroundValue(element.getText())); } } else if (element instanceof XmlAttribute) { final String attributeName = ((XmlAttribute)element).getName(); @@ -87,28 +82,23 @@ public class JavaFxAnnotator implements Annotator { } private static void attachColorIcon(final PsiElement element, AnnotationHolder holder, String attributeValueText) { - final PsiElement parent = element.getParent(); - if (parent instanceof XmlAttribute) { - final XmlAttributeDescriptor descriptor = ((XmlAttribute)parent).getDescriptor(); - if (descriptor instanceof JavaFxPropertyAttributeDescriptor) { - final PsiElement declaration = descriptor.getDeclaration(); - if (declaration instanceof PsiField) { - final PsiField field = (PsiField)declaration; - final PsiClassType propertyClassType = JavaFxPsiUtil.getPropertyClassType(field); - if (propertyClassType != null && InheritanceUtil.isInheritor(propertyClassType, JavaFxCommonClassNames.JAVAFX_SCENE_PAINT)) { - try { - final Color color = ColorUtil.fromHex(attributeValueText.substring(1)); - if (color != null) { - final ColorIcon icon = new ColorIcon(8, color); - final Annotation annotation = holder.createInfoAnnotation(element, null); - annotation.setGutterIconRenderer(new ColorIconRenderer(icon, element)); - } - } - catch (Exception ignored) { - } - } + try { + Color color = null; + if (attributeValueText.startsWith("#")) { + color = ColorUtil.fromHex(attributeValueText.substring(1)); + } else { + final String hexCode = ColorSampleLookupValue.getHexCodeForColorName(StringUtil.toLowerCase(attributeValueText)); + if (hexCode != null) { + color = ColorUtil.fromHex(hexCode); } } + if (color != null) { + final ColorIcon icon = new ColorIcon(8, color); + final Annotation annotation = holder.createInfoAnnotation(element, null); + annotation.setGutterIconRenderer(new ColorIconRenderer(icon, element)); + } + } + catch (Exception ignored) { } } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxColorReference.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxColorReference.java new file mode 100644 index 000000000000..e3ac22476a13 --- /dev/null +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxColorReference.java @@ -0,0 +1,69 @@ +/* + * Copyright 2000-2013 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.javaFX.fxml.refs; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.JavaPsiFacade; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReferenceBase; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.xml.XmlAttributeValue; +import com.intellij.xml.util.ColorSampleLookupValue; +import com.intellij.xml.util.UserColorLookup; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.javaFX.fxml.JavaFxCommonClassNames; + +/** + * User: anna + * Date: 3/7/13 + */ +public class JavaFxColorReference extends PsiReferenceBase { + public JavaFxColorReference(XmlAttributeValue value) { + super(value); + } + + @Nullable + @Override + public PsiElement resolve() { + final Project project = getElement().getProject(); + final PsiClass psiClass = + JavaPsiFacade.getInstance(project).findClass(JavaFxCommonClassNames.JAVAFX_SCENE_COLOR, GlobalSearchScope.allScope(project)); + if (psiClass != null) { + return psiClass.findFieldByName(getCanonicalText().toUpperCase(), false); + } + return null; + } + + @NotNull + @Override + public Object[] getVariants() { + final ColorSampleLookupValue[] lookupValues = ColorSampleLookupValue.getColors(); + final Object[] vars = new Object[lookupValues.length + 1]; + for (int i = 0; i < lookupValues.length; i++) { + final ColorSampleLookupValue value = lookupValues[i]; + vars[i] = new ColorSampleLookupValue(value.getName(), value.getValue(), true); + } + vars[lookupValues.length] = new UserColorLookup(); + return vars; + } + + @Override + public boolean isSoft() { + return true; + } +} diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxColorReferenceProvider.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxColorReferenceProvider.java new file mode 100644 index 000000000000..d53f8752ec90 --- /dev/null +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxColorReferenceProvider.java @@ -0,0 +1,55 @@ +/* + * Copyright 2000-2013 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.javaFX.fxml.refs; + +import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; +import com.intellij.psi.xml.XmlAttribute; +import com.intellij.psi.xml.XmlAttributeValue; +import com.intellij.util.ProcessingContext; +import com.intellij.xml.XmlAttributeDescriptor; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.javaFX.fxml.JavaFxCommonClassNames; +import org.jetbrains.plugins.javaFX.fxml.JavaFxPsiUtil; +import org.jetbrains.plugins.javaFX.fxml.descriptors.JavaFxPropertyAttributeDescriptor; + +/** +* User: anna +* Date: 3/7/13 +*/ +class JavaFxColorReferenceProvider extends PsiReferenceProvider { + @NotNull + @Override + public PsiReference[] getReferencesByElement(@NotNull PsiElement element, + @NotNull ProcessingContext context) { + final XmlAttributeValue attributeValue = (XmlAttributeValue)element; + final PsiElement parent = attributeValue.getParent(); + if (parent instanceof XmlAttribute) { + final XmlAttributeDescriptor descriptor = ((XmlAttribute)parent).getDescriptor(); + if (descriptor instanceof JavaFxPropertyAttributeDescriptor) { + final PsiElement declaration = descriptor.getDeclaration(); + if (declaration instanceof PsiField) { + final PsiField field = (PsiField)declaration; + final PsiClassType propertyClassType = JavaFxPsiUtil.getPropertyClassType(field); + if (propertyClassType != null && InheritanceUtil.isInheritor(propertyClassType, JavaFxCommonClassNames.JAVAFX_SCENE_PAINT)) { + return new PsiReference[] {new JavaFxColorReference(attributeValue)}; + } + } + } + } + return PsiReference.EMPTY_ARRAY; + } +} diff --git a/plugins/javaFX/testData/completion/namedColors.fxml b/plugins/javaFX/testData/completion/namedColors.fxml new file mode 100644 index 000000000000..dda432697fcb --- /dev/null +++ b/plugins/javaFX/testData/completion/namedColors.fxml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/plugins/javaFX/testData/completion/namedColors_after.fxml b/plugins/javaFX/testData/completion/namedColors_after.fxml new file mode 100644 index 000000000000..e1b752eca61d --- /dev/null +++ b/plugins/javaFX/testData/completion/namedColors_after.fxml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/plugins/javaFX/testData/highlighting/namedColor.fxml b/plugins/javaFX/testData/highlighting/namedColor.fxml new file mode 100644 index 000000000000..7322af9e0fb9 --- /dev/null +++ b/plugins/javaFX/testData/highlighting/namedColor.fxml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file From bb022d3b3847617b7d7bd6e727779488cefe2bd1 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Thu, 7 Mar 2013 16:08:40 +0100 Subject: [PATCH 18/57] Use accept method in processing. --- .../com/intellij/psi/impl/SyntheticFileSystemItem.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/platform/lang-impl/src/com/intellij/psi/impl/SyntheticFileSystemItem.java b/platform/lang-impl/src/com/intellij/psi/impl/SyntheticFileSystemItem.java index 4e10d2bb1cd5..49091867fdf8 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/SyntheticFileSystemItem.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/SyntheticFileSystemItem.java @@ -11,6 +11,7 @@ import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.search.PsiElementProcessor; +import com.intellij.psi.search.PsiFileSystemItemProcessor; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NonNls; @@ -28,6 +29,14 @@ public abstract class SyntheticFileSystemItem extends PsiElementBase implements myManager = PsiManager.getInstance(myProject); } + protected static boolean processFileSystemItem(PsiElementProcessor processor, PsiFileSystemItem element) { + if (processor instanceof PsiFileSystemItemProcessor && !((PsiFileSystemItemProcessor)processor).acceptItem(element.getName(), true)) { + return true; + } + + return processor.execute(element); + } + public boolean isDirectory() { return true; } From 26a4c8f5c826d5fff4089e08fe157f12010d7ceb Mon Sep 17 00:00:00 2001 From: Vassiliy Kudryashov Date: Thu, 7 Mar 2013 19:28:32 +0400 Subject: [PATCH 19/57] IDEA-99567 Temporary Configuration Limit cannot be set to 0 --- .../lang-impl/src/com/intellij/execution/RunManagerConfig.java | 3 ++- .../src/com/intellij/execution/impl/RunConfigurable.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/RunManagerConfig.java b/platform/lang-impl/src/com/intellij/execution/RunManagerConfig.java index c484f0be8920..71049b4ee7d7 100644 --- a/platform/lang-impl/src/com/intellij/execution/RunManagerConfig.java +++ b/platform/lang-impl/src/com/intellij/execution/RunManagerConfig.java @@ -25,6 +25,7 @@ public class RunManagerConfig { public static final String MAKE = ExecutionBundle.message("before.run.property.make"); private final StoringPropertyContainer myProperties; private final PropertiesComponent myPropertiesComponent; + public static final int MIN_RECENT_LIMIT = 0; @NonNls private static final String RECENTS_LIMIT = "recentsLimit"; @NonNls private static final String RESTART_REQUIRES_CONFIRMATION = "restartRequiresConfirmation"; @@ -36,7 +37,7 @@ public class RunManagerConfig { public int getRecentsLimit() { try { - return Math.max(1, Integer.valueOf(myPropertiesComponent.getOrInit(RECENTS_LIMIT, "5")).intValue()); + return Math.max(MIN_RECENT_LIMIT, Integer.valueOf(myPropertiesComponent.getOrInit(RECENTS_LIMIT, "5")).intValue()); } catch (NumberFormatException e) { return 5; diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java index 985c751e65c5..d63d35f2d366 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java @@ -624,7 +624,7 @@ class RunConfigurable extends BaseConfigurable { } try { - int i = Math.max(1, Integer.parseInt(myRecentsLimit.getText())); + int i = Math.max(RunManagerConfig.MIN_RECENT_LIMIT, Integer.parseInt(myRecentsLimit.getText())); int oldLimit = manager.getConfig().getRecentsLimit(); if (oldLimit != i) { manager.getConfig().setRecentsLimit(i); From 15fc567735ea506b0f56f7b34f8921b67ad2e0ea Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 7 Mar 2013 20:16:37 +0400 Subject: [PATCH 20/57] diagnostics --- .../intellij/openapi/vfs/newvfs/impl/VirtualDirectoryImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualDirectoryImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualDirectoryImpl.java index 6c594ca60011..f2574bc66896 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualDirectoryImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualDirectoryImpl.java @@ -540,7 +540,7 @@ public class VirtualDirectoryImpl extends VirtualFileSystemEntry { Function verboseToString = new Function() { @Override public String fun(VirtualFileSystemEntry entry) { - return entry + " (" + entry.getClass() + ")"; + return entry + " (name: '" + entry.getName() + "')"; } }; String children = StringUtil.join(array, verboseToString, ","); From 9a6369cedb4607afa29373b7c29c389862eb8bc9 Mon Sep 17 00:00:00 2001 From: Serega Vasiliev Date: Thu, 7 Mar 2013 18:21:28 +0100 Subject: [PATCH 21/57] spring model caching --- .../src/com/intellij/util/xml/PsiClassConverter.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/util/xml/PsiClassConverter.java b/java/java-impl/src/com/intellij/util/xml/PsiClassConverter.java index d4f579084216..8a2ed8be9d12 100644 --- a/java/java-impl/src/com/intellij/util/xml/PsiClassConverter.java +++ b/java/java-impl/src/com/intellij/util/xml/PsiClassConverter.java @@ -33,9 +33,11 @@ import org.jetbrains.annotations.Nullable; public class PsiClassConverter extends Converter implements CustomReferenceConverter { public PsiClass fromString(final String s, final ConvertContext context) { + if (StringUtil.isEmptyOrSpaces(s)) return null; + final DomElement element = context.getInvocationElement(); final GlobalSearchScope scope = element instanceof GenericDomValue ? getScope(context) : null; - return DomJavaUtil.findClass(s, context.getFile(), context.getModule(), scope); + return DomJavaUtil.findClass(s.trim(), context.getFile(), context.getModule(), scope); } @Nullable From 8ad46fce88b20eca6eb9a3561f7e1b7e967bab72 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 7 Mar 2013 12:25:59 +0100 Subject: [PATCH 22/57] Formatting --- .../impl/source/PsiClassReferenceType.java | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassReferenceType.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassReferenceType.java index 69fb266024db..703cda41d634 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassReferenceType.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassReferenceType.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2013 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. @@ -32,29 +32,27 @@ import java.util.List; */ public class PsiClassReferenceType extends PsiClassType { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.PsiClassReferenceType"); + private final PsiJavaCodeReferenceElement myReference; - public PsiClassReferenceType(@NotNull PsiJavaCodeReferenceElement reference, LanguageLevel languageLevel) { - super(languageLevel, extractAnnosFromReference(reference)); + public PsiClassReferenceType(@NotNull PsiJavaCodeReferenceElement reference, LanguageLevel langLevel) { + this(reference, langLevel, collectAnnotations(reference)); + } + + public PsiClassReferenceType(@NotNull PsiJavaCodeReferenceElement reference, LanguageLevel langLevel, @NotNull PsiAnnotation[] annotations) { + super(langLevel, annotations); myReference = reference; } - private static PsiAnnotation[] extractAnnosFromReference(PsiJavaCodeReferenceElement reference) { + private static PsiAnnotation[] collectAnnotations(PsiJavaCodeReferenceElement reference) { List result = null; - for(PsiElement child = reference.getFirstChild(); child != null; child = child.getNextSibling()){ + for (PsiElement child = reference.getFirstChild(); child != null; child = child.getNextSibling()) { if (child instanceof PsiAnnotation) { if (result == null) result = new SmartList(); result.add((PsiAnnotation)child); } } - - if (result == null) return PsiAnnotation.EMPTY_ARRAY; - return result.toArray(new PsiAnnotation[result.size()]); - } - - public PsiClassReferenceType(@NotNull PsiJavaCodeReferenceElement reference, LanguageLevel languageLevel, PsiAnnotation[] annotations) { - super(languageLevel,annotations); - myReference = reference; + return result == null ? PsiAnnotation.EMPTY_ARRAY : result.toArray(new PsiAnnotation[result.size()]); } @Override @@ -84,7 +82,7 @@ public class PsiClassReferenceType extends PsiClassType { @Override public PsiClassType setLanguageLevel(@NotNull final LanguageLevel languageLevel) { if (languageLevel.equals(myLanguageLevel)) return this; - return new PsiClassReferenceType(myReference,languageLevel,getAnnotations()); + return new PsiClassReferenceType(myReference, languageLevel, getAnnotations()); } @Override @@ -158,9 +156,9 @@ public class PsiClassReferenceType extends PsiClassType { } String qualifiedName = myReference.getQualifiedName(); String name = myReference.getReferenceName(); - if (name==null) name=""; + if (name == null) name = ""; LightClassReference reference = new LightClassReference(myReference.getManager(), name, qualifiedName, myReference.getResolveScope()); - return new PsiClassReferenceType(reference, null,getAnnotations()); + return new PsiClassReferenceType(reference, null, getAnnotations()); } @Override @@ -175,9 +173,9 @@ public class PsiClassReferenceType extends PsiClassType { } public PsiClassType createImmediateCopy() { - final ClassResolveResult resolveResult = resolveGenerics(); - if (resolveResult.getElement() == null) return this; - return new PsiImmediateClassType(resolveResult.getElement(), resolveResult.getSubstitutor()); + ClassResolveResult resolveResult = resolveGenerics(); + PsiClass element = resolveResult.getElement(); + return element != null ? new PsiImmediateClassType(element, resolveResult.getSubstitutor()) : this; } @Override From e62d1be6f381042e1b0a69f34c861960216ef4ad Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 7 Mar 2013 14:27:57 +0100 Subject: [PATCH 23/57] EA-44628 (check file validity) --- .../src/com/intellij/analysis/AnalysisScope.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/platform/lang-api/src/com/intellij/analysis/AnalysisScope.java b/platform/lang-api/src/com/intellij/analysis/AnalysisScope.java index 6d9032371052..c3c58b411cad 100644 --- a/platform/lang-api/src/com/intellij/analysis/AnalysisScope.java +++ b/platform/lang-api/src/com/intellij/analysis/AnalysisScope.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2013 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. @@ -121,7 +121,7 @@ public class AnalysisScope { myModule = null; myScope = null; myElement = psiDirectory; - myType = DIRECTORY; + myType = DIRECTORY; } public AnalysisScope(@NotNull PsiFile psiFile) { @@ -555,14 +555,18 @@ public class AnalysisScope { } } - private static PsiFile getPsiFileInReadAction(@NotNull final PsiManager psiManager, @NotNull final VirtualFile file) { return ApplicationManager.getApplication().runReadAction(new Computable() { @Override @Nullable public PsiFile compute() { - final PsiFile psiFile = psiManager.findFile(file); - return psiFile != null && psiFile.isValid() ? psiFile : null; + if (file.isValid()) { + PsiFile psiFile = psiManager.findFile(file); + if (psiFile != null && psiFile.isValid()) { + return psiFile; + } + } + return null; } }); } From fa87fa9529eb8b6f46ba20084097a275d416137d Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 7 Mar 2013 18:04:46 +0100 Subject: [PATCH 24/57] IDEA-102620 (get file manager name from .desktop file) --- .../ide/actions/ShowFilePathAction.java | 61 +++++++++++++------ 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/actions/ShowFilePathAction.java b/platform/platform-impl/src/com/intellij/ide/actions/ShowFilePathAction.java index 22776d256dd6..3be757641d09 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/ShowFilePathAction.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/ShowFilePathAction.java @@ -50,8 +50,7 @@ import javax.swing.*; import javax.swing.filechooser.FileSystemView; import java.awt.*; import java.awt.event.MouseEvent; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -67,8 +66,8 @@ public class ShowFilePathAction extends AnAction { return false; } - String fileManager = ExecUtil.execAndReadLine("xdg-mime", "query", "default", "inode/directory"); - if (fileManager == null || !fileManager.contains("nautilus.desktop")) return false; + String appName = ExecUtil.execAndReadLine("xdg-mime", "query", "default", "inode/directory"); + if (appName == null || !appName.matches("nautilus.*\\.desktop")) return false; String version = ExecUtil.execAndReadLine("nautilus", "--version"); if (version == null) return false; @@ -82,28 +81,50 @@ public class ShowFilePathAction extends AnAction { @NotNull @Override protected String compute() { - if (SystemInfo.isMac) { - return "Finder"; - } - - if (SystemInfo.isWindows) { - return "Explorer"; - } - + if (SystemInfo.isMac) return "Finder"; + if (SystemInfo.isWindows) return "Explorer"; if (SystemInfo.isUnix && SystemInfo.hasXdgMime()) { - String fileManager = ExecUtil.execAndReadLine("xdg-mime", "query", "default", "inode/directory"); - if (fileManager != null) { - Matcher m = Pattern.compile("(.+)\\.desktop").matcher(fileManager); - if (m.find()) { - return StringUtil.capitalize(m.group(1)); - } - } + String name = getUnixFileManagerName(); + if (name != null) return name; } - return "File Manager"; } }; + @Nullable + private static String getUnixFileManagerName() { + String appName = ExecUtil.execAndReadLine("xdg-mime", "query", "default", "inode/directory"); + if (appName == null || !appName.matches(".+\\.desktop")) return null; + + String dirs = System.getenv("XDG_DATA_DIRS"); + if (dirs == null) return null; + + try { + for (String dir : dirs.split(File.pathSeparator)) { + File appFile = new File(dir, "applications/" + appName); + if (appFile.exists()) { + BufferedReader reader = new BufferedReader(new FileReader(appFile)); + try { + String line; + while ((line = reader.readLine()) != null) { + if (line.startsWith("Name=")) { + return line.substring(5); + } + } + } + finally { + reader.close(); + } + } + } + } + catch (IOException e) { + LOG.info("Cannot read desktop file", e); + } + + return null; + } + @Override public void update(final AnActionEvent e) { if (SystemInfo.isMac || !isSupported()) { From dcbdc174691b99c9a1c9143fe54fd84933f7399e Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 7 Mar 2013 18:28:03 +0100 Subject: [PATCH 25/57] Deprecated method call replaced --- .../ide/actions/ShowFilePathAction.java | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/actions/ShowFilePathAction.java b/platform/platform-impl/src/com/intellij/ide/actions/ShowFilePathAction.java index 3be757641d09..2a7e155eccf1 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/ShowFilePathAction.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/ShowFilePathAction.java @@ -35,6 +35,7 @@ import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.ui.popup.ListPopup; import com.intellij.openapi.ui.popup.PopupStep; import com.intellij.openapi.ui.popup.util.BaseListPopupStep; +import com.intellij.openapi.util.AsyncResult; import com.intellij.openapi.util.AtomicNotNullLazyValue; import com.intellij.openapi.util.NotNullLazyValue; import com.intellij.openapi.util.SystemInfo; @@ -50,7 +51,10 @@ import javax.swing.*; import javax.swing.filechooser.FileSystemView; import java.awt.*; import java.awt.event.MouseEvent; -import java.io.*; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -126,7 +130,7 @@ public class ShowFilePathAction extends AnAction { } @Override - public void update(final AnActionEvent e) { + public void update(AnActionEvent e) { if (SystemInfo.isMac || !isSupported()) { e.getPresentation().setVisible(false); return; @@ -134,11 +138,15 @@ public class ShowFilePathAction extends AnAction { e.getPresentation().setEnabled(getFile(e) != null); } - public void actionPerformed(final AnActionEvent e) { + public void actionPerformed(AnActionEvent e) { show(getFile(e), new ShowAction() { public void show(final ListPopup popup) { - final DataContext context = DataManager.getInstance().getDataContext(); - popup.showInBestPositionFor(context); + DataManager.getInstance().getDataContextFromFocus().doWhenDone(new AsyncResult.Handler() { + @Override + public void run(DataContext context) { + popup.showInBestPositionFor(context); + } + }); } }); } @@ -146,8 +154,9 @@ public class ShowFilePathAction extends AnAction { public static void show(final VirtualFile file, final MouseEvent e) { show(file, new ShowAction() { public void show(final ListPopup popup) { - if (!e.getComponent().isShowing()) return; - popup.show(new RelativePoint(e)); + if (e.getComponent().isShowing()) { + popup.show(new RelativePoint(e)); + } } }); } @@ -274,6 +283,7 @@ public class ShowFilePathAction extends AnAction { * * @param directory a directory to show in a file manager. */ + @SuppressWarnings("UnusedDeclaration") public static void openDirectory(@NotNull final File directory) { if (!directory.isDirectory()) return; try { From d4e0b02564b7f6aca12557ca9ddb34bda9c6deb4 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Thu, 7 Mar 2013 19:27:49 +0100 Subject: [PATCH 26/57] fix SOE --- .../debugger/jdi/StackFrameProxyImpl.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/jdi/StackFrameProxyImpl.java b/java/debugger/impl/src/com/intellij/debugger/jdi/StackFrameProxyImpl.java index 01a6c14c14ec..5761e27f93c4 100644 --- a/java/debugger/impl/src/com/intellij/debugger/jdi/StackFrameProxyImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/jdi/StackFrameProxyImpl.java @@ -28,6 +28,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.sun.jdi.*; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; @@ -172,18 +173,23 @@ public class StackFrameProxyImpl extends JdiProxy implements StackFrameProxy { } } + @Nullable public ObjectReference thisObject() throws EvaluateException { DebuggerManagerThreadImpl.assertIsManagerThread(); checkValid(); try { - if(myThisReference == null) { - myThisReference = getStackFrame().thisObject(); + for (int attempt = 0; attempt < 2; attempt++) { + try { + if(myThisReference == null) { + myThisReference = getStackFrame().thisObject(); + } + break; + } + catch (InvalidStackFrameException e) { + clearCaches(); + } } } - catch (InvalidStackFrameException e) { - clearCaches(); - return thisObject(); - } catch (InternalException e) { // supress some internal errors caused by bugs in specific JDI implementations if(e.errorCode() != 23) { From cf202ee6fda4106b547425fb60a16105399de542 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Thu, 7 Mar 2013 19:46:09 +0100 Subject: [PATCH 27/57] Remote external tools should work in Before Launch (PY-9078). --- .../tools/AbstractToolBeforeRunTask.java | 125 ++++++++++++++++++ .../AbstractToolBeforeRunTaskProvider.java | 93 +++++++++++++ .../ExternalToolsCheckinHandlerFactory.java | 2 +- .../com/intellij/tools/ToolBeforeRunTask.java | 94 +------------ .../tools/ToolBeforeRunTaskProvider.java | 69 +--------- .../com/intellij/tools/ToolSelectDialog.java | 5 +- 6 files changed, 228 insertions(+), 160 deletions(-) create mode 100644 platform/lang-impl/src/com/intellij/tools/AbstractToolBeforeRunTask.java create mode 100644 platform/lang-impl/src/com/intellij/tools/AbstractToolBeforeRunTaskProvider.java diff --git a/platform/lang-impl/src/com/intellij/tools/AbstractToolBeforeRunTask.java b/platform/lang-impl/src/com/intellij/tools/AbstractToolBeforeRunTask.java new file mode 100644 index 000000000000..2e58ce737759 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/tools/AbstractToolBeforeRunTask.java @@ -0,0 +1,125 @@ +/* + * Copyright 2000-2013 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 com.intellij.tools; + +import com.intellij.execution.BeforeRunTask; +import com.intellij.execution.process.ProcessAdapter; +import com.intellij.execution.process.ProcessEvent; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ModalityState; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.Ref; +import com.intellij.util.concurrency.Semaphore; +import org.jdom.Element; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +/** + * @author traff + */ +public abstract class AbstractToolBeforeRunTask + extends BeforeRunTask { + @NonNls private final static String ACTION_ID_ATTRIBUTE = "actionId"; + private static final Logger LOG = Logger.getInstance(AbstractToolBeforeRunTask.class); + protected String myToolActionId; + + public AbstractToolBeforeRunTask(Key providerId) { + super(providerId); + } + + @Nullable + public String getToolActionId() { + return myToolActionId; + } + + @Override + public void writeExternal(Element element) { + super.writeExternal(element); + if (myToolActionId != null) { + element.setAttribute(ACTION_ID_ATTRIBUTE, myToolActionId); + } + } + + @Override + public void readExternal(Element element) { + super.readExternal(element); + myToolActionId = element.getAttributeValue(ACTION_ID_ATTRIBUTE); + } + + @Override + public ToolBeforeRunTask clone() { + return (ToolBeforeRunTask)super.clone(); + } + + public void setToolActionId(String toolActionId) { + myToolActionId = toolActionId; + } + + public boolean isExecutable() { + return myToolActionId != null; + } + + public boolean execute(final DataContext context, final long executionId) { + final Semaphore targetDone = new Semaphore(); + final Ref result = new Ref(false); + + try { + ApplicationManager.getApplication().invokeAndWait(new Runnable() { + @Override + public void run() { + targetDone.down(); + boolean runToolResult = ToolAction.runTool(myToolActionId, context, null, executionId, new ProcessAdapter() { + @Override + public void processTerminated(ProcessEvent event) { + result.set(event.getExitCode() == 0); + targetDone.up(); + } + }); + if (!runToolResult) { + result.set(false); + targetDone.up(); + } + } + }, ModalityState.NON_MODAL); + } + catch (Exception e) { + LOG.error(e); + return false; + } + targetDone.waitFor(); + return result.get(); + } + + @Nullable + public T findCorrespondingTool() { + if (myToolActionId == null) { + return null; + } + List tools = getTools(); + for (T tool : tools) { + if (myToolActionId.equals(tool.getActionId())) { + return tool; + } + } + return null; + } + + protected abstract List getTools(); +} diff --git a/platform/lang-impl/src/com/intellij/tools/AbstractToolBeforeRunTaskProvider.java b/platform/lang-impl/src/com/intellij/tools/AbstractToolBeforeRunTaskProvider.java new file mode 100644 index 000000000000..6df8eecfe2c2 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/tools/AbstractToolBeforeRunTaskProvider.java @@ -0,0 +1,93 @@ +/* + * Copyright 2000-2013 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 com.intellij.tools; + +import com.intellij.execution.BeforeRunTaskProvider; +import com.intellij.execution.configurations.RunConfiguration; +import com.intellij.execution.runners.ExecutionEnvironment; +import com.intellij.icons.AllIcons; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.text.StringUtil; + +import javax.swing.*; + +/** + * @author traff + */ +public abstract class AbstractToolBeforeRunTaskProvider extends BeforeRunTaskProvider { + protected static final Logger LOG = Logger.getInstance("#" + ToolBeforeRunTaskProvider.class.getName()); + + @Override + public Icon getIcon() { + return AllIcons.General.ExternalToolsSmall; + } + + @Override + public boolean configureTask(RunConfiguration runConfiguration, T task) { + final ToolSelectDialog dialog = new ToolSelectDialog(runConfiguration.getProject(), task.getToolActionId(), createToolsPanel()); + dialog.show(); + if (!dialog.isOK()) { + return false; + } + boolean isModified = dialog.isModified(); + Tool selectedTool = dialog.getSelectedTool(); + LOG.assertTrue(selectedTool != null); + String selectedToolId = selectedTool.getActionId(); + String oldToolId = task.getToolActionId(); + if (oldToolId != null && oldToolId.equals(selectedToolId)) { + return isModified; + } + task.setToolActionId(selectedToolId); + return true; + } + + protected abstract BaseToolsPanel createToolsPanel(); + + @Override + public boolean canExecuteTask(RunConfiguration configuration, T task) { + return task.isExecutable(); + } + + @Override + public String getDescription(T task) { + final String actionId = task.getToolActionId(); + if (actionId == null) { + LOG.error("Null id"); + return ToolsBundle.message("tools.unknown.external.tool"); + } + Tool tool = task.findCorrespondingTool(); + if (tool == null) { + return ToolsBundle.message("tools.unknown.external.tool"); + } + String groupName = tool.getGroup(); + return ToolsBundle + .message("tools.before.run.description", StringUtil.isEmpty(groupName) ? tool.getName() : groupName + "/" + tool.getName()); + } + + @Override + public boolean isConfigurable() { + return true; + } + + @Override + public boolean executeTask(DataContext context, RunConfiguration configuration, ExecutionEnvironment env, T task) { + if (!task.isExecutable()) { + return false; + } + return task.execute(context, env.getExecutionId()); + } +} diff --git a/platform/lang-impl/src/com/intellij/tools/ExternalToolsCheckinHandlerFactory.java b/platform/lang-impl/src/com/intellij/tools/ExternalToolsCheckinHandlerFactory.java index cbbfeeebfa46..aaf941934147 100644 --- a/platform/lang-impl/src/com/intellij/tools/ExternalToolsCheckinHandlerFactory.java +++ b/platform/lang-impl/src/com/intellij/tools/ExternalToolsCheckinHandlerFactory.java @@ -80,7 +80,7 @@ public class ExternalToolsCheckinHandlerFactory extends CheckinHandlerFactory { if (item instanceof Tool) { id = ((Tool)item).getActionId(); } - final ToolSelectDialog dialog = new ToolSelectDialog(panel.getProject(), id); + final ToolSelectDialog dialog = new ToolSelectDialog(panel.getProject(), id, new ToolsPanel()); dialog.show(); if (!dialog.isOK()) { return; diff --git a/platform/lang-impl/src/com/intellij/tools/ToolBeforeRunTask.java b/platform/lang-impl/src/com/intellij/tools/ToolBeforeRunTask.java index 632e80830f60..eff984ad2734 100644 --- a/platform/lang-impl/src/com/intellij/tools/ToolBeforeRunTask.java +++ b/platform/lang-impl/src/com/intellij/tools/ToolBeforeRunTask.java @@ -15,104 +15,16 @@ */ package com.intellij.tools; -import com.intellij.execution.BeforeRunTask; -import com.intellij.execution.process.ProcessAdapter; -import com.intellij.execution.process.ProcessEvent; -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.application.ModalityState; -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.util.Ref; -import com.intellij.util.concurrency.Semaphore; -import org.jdom.Element; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.Nullable; - import java.util.List; -public class ToolBeforeRunTask extends BeforeRunTask { - private static final Logger LOG = Logger.getInstance(ToolBeforeRunTask.class); - @NonNls private final static String ACTION_ID_ATTRIBUTE = "actionId"; - private String myToolActionId; +public class ToolBeforeRunTask extends AbstractToolBeforeRunTask { protected ToolBeforeRunTask() { super(ToolBeforeRunTaskProvider.ID); } - @Nullable - public String getToolActionId() { - return myToolActionId; - } - - public void setToolActionId(String toolActionId) { - myToolActionId = toolActionId; - } - - public boolean isExecutable() { - return myToolActionId != null; - } - @Override - public void writeExternal(Element element) { - super.writeExternal(element); - if (myToolActionId != null) { - element.setAttribute(ACTION_ID_ATTRIBUTE, myToolActionId); - } - } - - @Override - public void readExternal(Element element) { - super.readExternal(element); - myToolActionId = element.getAttributeValue(ACTION_ID_ATTRIBUTE); - } - - @Override - public ToolBeforeRunTask clone() { - return (ToolBeforeRunTask)super.clone(); - } - - public boolean execute(final DataContext context, final long executionId) { - final Semaphore targetDone = new Semaphore(); - final Ref result = new Ref(false); - - try { - ApplicationManager.getApplication().invokeAndWait(new Runnable() { - @Override - public void run() { - targetDone.down(); - boolean runToolResult = ToolAction.runTool(myToolActionId, context, null, executionId, new ProcessAdapter() { - @Override - public void processTerminated(ProcessEvent event) { - result.set(event.getExitCode() == 0); - targetDone.up(); - } - }); - if (!runToolResult) { - result.set(false); - targetDone.up(); - } - } - }, ModalityState.NON_MODAL); - } - catch (Exception e) { - LOG.error(e); - return false; - } - targetDone.waitFor(); - return result.get(); - } - - @Nullable - public Tool findCorrespondingTool() { - if (myToolActionId == null) { - return null; - } - List tools = ToolManager.getInstance().getTools(); - for (Tool tool : tools) { - if (myToolActionId.equals(tool.getActionId())) { - return tool; - } - } - return null; + protected List getTools() { + return ToolManager.getInstance().getTools(); } } diff --git a/platform/lang-impl/src/com/intellij/tools/ToolBeforeRunTaskProvider.java b/platform/lang-impl/src/com/intellij/tools/ToolBeforeRunTaskProvider.java index 828e7add5cc7..678e0b6a7657 100644 --- a/platform/lang-impl/src/com/intellij/tools/ToolBeforeRunTaskProvider.java +++ b/platform/lang-impl/src/com/intellij/tools/ToolBeforeRunTaskProvider.java @@ -15,21 +15,11 @@ */ package com.intellij.tools; -import com.intellij.execution.BeforeRunTaskProvider; import com.intellij.execution.configurations.RunConfiguration; -import com.intellij.execution.runners.ExecutionEnvironment; -import com.intellij.icons.AllIcons; -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Key; -import com.intellij.openapi.util.text.StringUtil; -import javax.swing.*; - -public class ToolBeforeRunTaskProvider extends BeforeRunTaskProvider { +public class ToolBeforeRunTaskProvider extends AbstractToolBeforeRunTaskProvider { static final Key ID = Key.create("ToolBeforeRunTask"); - private static final Logger LOG = Logger.getInstance("#" + ToolBeforeRunTaskProvider.class.getName()); - @Override public Key getId() { @@ -41,66 +31,13 @@ public class ToolBeforeRunTaskProvider extends BeforeRunTaskProvider Date: Thu, 7 Mar 2013 20:34:23 +0100 Subject: [PATCH 28/57] javafx css: #id style completion/resolve --- .../src/META-INF/common-javaFX-plugin.xml | 1 + .../javaFX/JavaFxControllerClassIndex.java | 2 +- .../plugins/javaFX/JavaFxIdsIndex.java | 175 ++++++++++++++++++ 3 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 plugins/javaFX/src/org/jetbrains/plugins/javaFX/JavaFxIdsIndex.java diff --git a/plugins/javaFX/src/META-INF/common-javaFX-plugin.xml b/plugins/javaFX/src/META-INF/common-javaFX-plugin.xml index af2e51d3b7bb..bd2763370200 100644 --- a/plugins/javaFX/src/META-INF/common-javaFX-plugin.xml +++ b/plugins/javaFX/src/META-INF/common-javaFX-plugin.xml @@ -20,6 +20,7 @@ + org.jetbrains.plugins.javaFX.fxml.codeInsight.intentions.JavaFxCollapseSubTagToAttributeIntention JavaFX diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/JavaFxControllerClassIndex.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/JavaFxControllerClassIndex.java index bc692f2339e5..f1d5cac979d0 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/JavaFxControllerClassIndex.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/JavaFxControllerClassIndex.java @@ -132,7 +132,7 @@ public class JavaFxControllerClassIndex extends ScalarIndexExtension { } } - private static class MyInputFilter implements FileBasedIndex.InputFilter { + static class MyInputFilter implements FileBasedIndex.InputFilter { @Override public boolean acceptInput(final VirtualFile file) { return JavaFxFileTypeFactory.isFxml(file); diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/JavaFxIdsIndex.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/JavaFxIdsIndex.java new file mode 100644 index 000000000000..00882449045b --- /dev/null +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/JavaFxIdsIndex.java @@ -0,0 +1,175 @@ +/* + * Copyright 2000-2013 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.javaFX; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.util.CommonProcessors; +import com.intellij.util.indexing.*; +import com.intellij.util.io.DataExternalizer; +import com.intellij.util.io.EnumeratorStringDescriptor; +import com.intellij.util.io.KeyDescriptor; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.javaFX.fxml.FxmlConstants; +import org.jetbrains.plugins.javaFX.fxml.JavaFXNamespaceProvider; +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.io.StringReader; +import java.util.*; + +public class JavaFxIdsIndex extends FileBasedIndexExtension> { + + @NonNls public static final ID> KEY = ID.create("javafx.id.name"); + + private final KeyDescriptor myKeyDescriptor = new EnumeratorStringDescriptor(); + private final FileBasedIndex.InputFilter myInputFilter = new JavaFxControllerClassIndex.MyInputFilter(); + private final MyDataIndexer myDataIndexer = new MyDataIndexer(); + private final MyDataExternalizer myDataExternalizer = new MyDataExternalizer(); + + @NotNull + @Override + public DataIndexer, FileContent> getIndexer() { + return myDataIndexer; + } + + @Override + public DataExternalizer> getValueExternalizer() { + return myDataExternalizer; + } + + @Override + public FileBasedIndex.InputFilter getInputFilter() { + return myInputFilter; + } + + @NotNull + @Override + public ID> getName() { + return KEY; + } + + @Override + public KeyDescriptor getKeyDescriptor() { + return myKeyDescriptor; + } + + @Override + public boolean dependsOnFileContent() { + return true; + } + + @Override + public int getVersion() { + return 0; + } + + @NotNull + public static Collection getAllRegisteredIds(Project project) { + CommonProcessors.CollectUniquesProcessor processor = new CommonProcessors.CollectUniquesProcessor(); + FileBasedIndex.getInstance().processAllKeys(KEY, processor, project); + return processor.getResults(); + } + + @NotNull + public static Collection getFilePaths(Project project, String id) { + final List> values = FileBasedIndex.getInstance().getValues(KEY, id, GlobalSearchScope.projectScope(project)); + return (Collection)(values.isEmpty() ? Collections.emptySet() : values.get(0)); + } + + private static class MyDataIndexer implements DataIndexer, FileContent> { + private static final SAXParser SAX_PARSER = createParser(); + + private static SAXParser createParser() { + try { + return SAXParserFactory.newInstance().newSAXParser(); + } + catch (Exception e) { + return null; + } + } + + @Override + @NotNull + public Map> map(final FileContent inputData) { + final Map> map = getIds(inputData.getContentAsText().toString(), inputData.getFile().getPath()); + if (map != null) { + return map; + } + return Collections.emptyMap(); + } + + @Nullable + private static Map> getIds(String content, final String path) { + if (!content.contains(JavaFXNamespaceProvider.JAVAFX_NAMESPACE)) { + return null; + } + + final Map> map = new HashMap>(); + try { + SAX_PARSER.parse(new InputSource(new StringReader(content)), new DefaultHandler() { + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + final String attributesValue = attributes.getValue(FxmlConstants.FX_ID); + if (attributesValue != null) { + Set paths = map.get(attributesValue); + if (paths == null) { + paths = new HashSet(); + map.put(attributesValue, paths); + } + paths.add(path); + } + } + }); + } + catch (Exception e) { + // Do nothing. + } + + return map; + } + } + + private static class MyDataExternalizer implements DataExternalizer> { + @Override + public void save(DataOutput out, Set value) throws IOException { + out.writeInt(value.size()); + for (String s : value) { + out.writeUTF(s); + } + } + + @Override + public Set read(DataInput in) throws IOException { + final int size = in.readInt(); + final Set result = new HashSet(size); + + for (int i = 0; i < size; i++) { + final String s = in.readUTF(); + result.add(s); + } + return result; + } + } +} \ No newline at end of file From d23aa6c645acbcec4658fe4dccd72f5db3d33d80 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 7 Mar 2013 15:37:06 +0100 Subject: [PATCH 29/57] EA-44420 - NPE: GroovyClassNameInsertHandler.isInVariable --- .../lang/completion/GroovyClassNameInsertHandler.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java index c13b8aecec70..73f173928343 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java @@ -100,12 +100,16 @@ public class GroovyClassNameInsertHandler implements InsertHandler Date: Thu, 7 Mar 2013 18:39:58 +0100 Subject: [PATCH 30/57] [^yole] IDEA-102386 Cannot open additional project from console --- .../src/com/intellij/ide/CommandLineProcessor.java | 3 +++ platform/platform-impl/src/com/intellij/idea/SocketLock.java | 2 +- .../com/intellij/openapi/application/impl/ApplicationImpl.java | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/CommandLineProcessor.java b/platform/platform-impl/src/com/intellij/ide/CommandLineProcessor.java index e97ed83ff357..0f0a93d24bec 100644 --- a/platform/platform-impl/src/com/intellij/ide/CommandLineProcessor.java +++ b/platform/platform-impl/src/com/intellij/ide/CommandLineProcessor.java @@ -168,6 +168,9 @@ public class CommandLineProcessor { if (StringUtil.isQuotedString(arg)) { arg = StringUtil.stripQuotesAroundValue(arg); } + if (currentDirectory != null) { + arg = new File(currentDirectory, arg).getAbsolutePath(); + } if (line != -1) { final VirtualFile virtualFile = LocalFileSystem.getInstance().refreshAndFindFileByPath(arg); if (virtualFile != null) { diff --git a/platform/platform-impl/src/com/intellij/idea/SocketLock.java b/platform/platform-impl/src/com/intellij/idea/SocketLock.java index 7e15b46f7335..ecdf70aed992 100644 --- a/platform/platform-impl/src/com/intellij/idea/SocketLock.java +++ b/platform/platform-impl/src/com/intellij/idea/SocketLock.java @@ -161,7 +161,7 @@ public class SocketLock { if (result.contains(path)) { try { DataOutputStream out = new DataOutputStream(socket.getOutputStream()); - out.writeUTF(ACTIVATE_COMMAND + StringUtil.join(args, "\0")); + out.writeUTF(ACTIVATE_COMMAND + new File(".").getAbsolutePath() + "\0" + StringUtil.join(args, "\0")); out.flush(); String response = in.readUTF(); if (response.equals("ok")) { diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java index 8edb74113ee8..019aff2aa49e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java @@ -251,7 +251,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application invokeLater(new Runnable() { @Override public void run() { - final Project project = CommandLineProcessor.processExternalCommandLine(args, null); + final Project project = CommandLineProcessor.processExternalCommandLine(args.subList(1, args.size()), args.get(0)); final JFrame frame; if (project != null) { frame = (JFrame)WindowManager.getInstance().getIdeFrame(project); From af7d87d586c12974e53603e73f24bfdaa1823b68 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 7 Mar 2013 19:21:07 +0100 Subject: [PATCH 31/57] ensure RecursionManager internal consistency by not depending on user key hashCode being constant (many EA exceptions) --- .../openapi/util/RecursionManager.java | 28 +++++++++++------- .../openapi/util/RecursionManagerTest.groovy | 29 +++++++++++++++++-- 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/platform/util/src/com/intellij/openapi/util/RecursionManager.java b/platform/util/src/com/intellij/openapi/util/RecursionManager.java index 15c4c046c93a..c53185d06345 100644 --- a/platform/util/src/com/intellij/openapi/util/RecursionManager.java +++ b/platform/util/src/com/intellij/openapi/util/RecursionManager.java @@ -75,7 +75,7 @@ public class RecursionManager { public static RecursionGuard createGuard(@NonNls final String id) { return new RecursionGuard() { @Override - public T doPreventingRecursion(@NotNull Object key, boolean memoize, Computable computation) { + public T doPreventingRecursion(@NotNull Object key, boolean memoize, @NotNull Computable computation) { MyKey realKey = new MyKey(id, key); final CalculationStack stack = ourStack.get(); @@ -101,8 +101,6 @@ public class RecursionManager { } } - int oldHash = realKey.hashCode(); - final int sizeBefore = stack.progressMap.size(); stack.beforeComputation(realKey); final int sizeAfter = stack.progressMap.size(); @@ -122,17 +120,15 @@ public class RecursionManager { stack.afterComputation(realKey, sizeBefore, sizeAfter); } catch (Throwable e) { + //noinspection ThrowFromFinallyBlock throw new RuntimeException("Throwable in afterComputation", e); } stack.checkDepth("4"); - - if (oldHash != realKey.hashCode()) { - throw new AssertionError("Object has changed its hashCode: " + key); - } } } + @NotNull @Override public StackStamp markStack() { final int stamp = ourStack.get().reentrancyCount; @@ -144,6 +140,7 @@ public class RecursionManager { }; } + @NotNull @Override public List currentStack() { ArrayList result = new ArrayList(); @@ -168,8 +165,17 @@ public class RecursionManager { } private static class MyKey extends Pair { - public MyKey(String first, Object second) { - super(first, second); + private int myHashCode; + + public MyKey(String guardId, Object userObject) { + super(guardId, userObject); + // remember user object hashCode to ensure our internal maps consistency + myHashCode = guardId.hashCode() * 31 + userObject.hashCode(); + } + + @Override + public int hashCode() { + return myHashCode; } } @@ -266,10 +272,10 @@ public class RecursionManager { if (depth == 0) { intermediateCache.clear(); if (!key2ReentrancyDuringItsCalculation.isEmpty()) { - LOG.error("non-empty key2ReentrancyDuringItsCalculation: " + new HashMap(key2ReentrancyDuringItsCalculation)); + LOG.error("non-empty key2ReentrancyDuringItsCalculation: " + new HashMap(key2ReentrancyDuringItsCalculation)); } if (!toMemoize.isEmpty()) { - LOG.error("non-empty toMemoize: " + new HashSet(toMemoize)); + LOG.error("non-empty toMemoize: " + new HashSet(toMemoize)); } } diff --git a/platform/util/testSrc/com/intellij/openapi/util/RecursionManagerTest.groovy b/platform/util/testSrc/com/intellij/openapi/util/RecursionManagerTest.groovy index 6e4a2e1c5b0f..aed05ed3e93d 100644 --- a/platform/util/testSrc/com/intellij/openapi/util/RecursionManagerTest.groovy +++ b/platform/util/testSrc/com/intellij/openapi/util/RecursionManagerTest.groovy @@ -23,14 +23,14 @@ import junit.framework.TestCase; public class RecursionManagerTest extends TestCase { private final RecursionGuard myGuard = RecursionManager.createGuard("RecursionManagerTest"); - def prevent(String key, boolean memoize = true, Closure c) { + def prevent(Object key, boolean memoize = true, Closure c) { myGuard.doPreventingRecursion(key, memoize, c as Computable) } public void testPreventRecursion() { - assert "foo-return" == prevent("foo") { + assert "foo-return" == prevent(["foo"]) { assert "bar-return" == prevent("bar") { - assert null == prevent("foo") { "foo-return" } + assert null == prevent(["foo"]) { "foo-return" } return "bar-return" } return "foo-return" @@ -156,4 +156,27 @@ public class RecursionManagerTest extends TestCase { assert System.currentTimeMillis() - start < 10000 } + public void "test changing hash code doesn't crash RecursionManager"() { + def key = ["b"] + prevent(key) { + key << "a" + } + } + + public void "test exception from hashCode on exiting"() { + boolean fail = false + Object key = new Object() { + @Override + int hashCode() { + if (fail) { + throw new RuntimeException() + } + return super.hashCode() + } + } + prevent(key) { + fail = true + } + } + } From 8a76dea00c471e415da61191ee5a9dc08fd71797 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 7 Mar 2013 19:29:27 +0100 Subject: [PATCH 32/57] use StubIndex.safeGet to find java classes (EA-44473) --- .../impl/file/impl/JavaFileManagerBase.java | 29 ++++--------------- .../stubs/index/JavaFullClassNameIndex.java | 3 +- 2 files changed, 7 insertions(+), 25 deletions(-) diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/file/impl/JavaFileManagerBase.java b/java/java-indexing-impl/src/com/intellij/psi/impl/file/impl/JavaFileManagerBase.java index d55918700adc..60afa034b88c 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/file/impl/JavaFileManagerBase.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/file/impl/JavaFileManagerBase.java @@ -32,11 +32,9 @@ import com.intellij.psi.impl.PsiManagerEx; import com.intellij.psi.impl.file.PsiPackageImpl; import com.intellij.psi.impl.java.stubs.index.JavaFullClassNameIndex; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.Query; import com.intellij.util.containers.ConcurrentHashMap; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.indexing.FileBasedIndex; import com.intellij.util.messages.MessageBus; import com.intellij.util.messages.MessageBusConnection; import org.jetbrains.annotations.NonNls; @@ -130,15 +128,13 @@ public abstract class JavaFileManagerBase implements JavaFileManager, Disposable @Override public PsiClass[] findClasses(@NotNull String qName, @NotNull final GlobalSearchScope scope) { - final Collection classes = JavaFullClassNameIndex.getInstance().get(qName.hashCode(), myManager.getProject(), scope); + final Collection classes = JavaFullClassNameIndex.getInstance().get(qName.hashCode(), myManager.getProject(), scope); if (classes.isEmpty()) return PsiClass.EMPTY_ARRAY; List result = new ArrayList(classes.size()); int count = 0; PsiClass aClass = null; - for (PsiElement found : classes) { - if (notClass(found)) continue; - - aClass = (PsiClass)found; + for (PsiClass found : classes) { + aClass = found; final String qualifiedName = aClass.getQualifiedName(); if (qualifiedName == null || !qualifiedName.equals(qName)) continue; @@ -277,12 +273,9 @@ public abstract class JavaFileManagerBase implements JavaFileManager, Disposable private PsiClass findClassInIndex(String qName, GlobalSearchScope scope) { VirtualFile bestFile = null; PsiClass bestClass = null; - final Collection classes = JavaFullClassNameIndex.getInstance().get(qName.hashCode(), myManager.getProject(), scope); + final Collection classes = JavaFullClassNameIndex.getInstance().get(qName.hashCode(), myManager.getProject(), scope); - for (PsiElement found : classes) { - if (notClass(found)) continue; - - PsiClass aClass = (PsiClass)found; + for (PsiClass aClass : classes) { PsiFile file = aClass.getContainingFile(); if (file == null) { LOG.error("aClass=" + aClass); @@ -346,18 +339,6 @@ public abstract class JavaFileManagerBase implements JavaFileManager, Disposable return myNontrivialPackagePrefixes; } - private static boolean notClass(final PsiElement found) { - if (found instanceof PsiClass) return false; - - VirtualFile faultyContainer = PsiUtilCore.getVirtualFile(found); - LOG.error("Non class in class list: " + faultyContainer + ". found: " + found); - if (faultyContainer != null && faultyContainer.isValid()) { - FileBasedIndex.getInstance().requestReindex(faultyContainer); - } - - return true; - } - @Nullable private static PsiClass findClassByName(PsiJavaFile scope, String name) { PsiClass[] classes = scope.getClasses(); diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFullClassNameIndex.java b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFullClassNameIndex.java index 40c75f3551b3..a4f4c156b98d 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFullClassNameIndex.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFullClassNameIndex.java @@ -24,6 +24,7 @@ import com.intellij.psi.PsiClass; import com.intellij.psi.impl.search.JavaSourceFilterScope; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.stubs.IntStubIndexExtension; +import com.intellij.psi.stubs.StubIndex; import com.intellij.psi.stubs.StubIndexKey; import org.jetbrains.annotations.NotNull; @@ -44,6 +45,6 @@ public class JavaFullClassNameIndex extends IntStubIndexExtension { @Override public Collection get(final Integer integer, final Project project, @NotNull final GlobalSearchScope scope) { - return super.get(integer, project, new JavaSourceFilterScope(scope)); + return StubIndex.getInstance().safeGet(getKey(), integer, project, new JavaSourceFilterScope(scope), PsiClass.class); } } \ No newline at end of file From 31ab697103dc367b7c968670d37b131a4db2fca3 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 7 Mar 2013 19:36:58 +0100 Subject: [PATCH 33/57] workaround groovy runner NPE (EA-44399) --- .../plugins/groovy/runner/DefaultGroovyScriptRunner.java | 4 +++- .../jetbrains/plugins/groovy/runner/GroovyScriptRunner.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/DefaultGroovyScriptRunner.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/DefaultGroovyScriptRunner.java index 7bd62c3bb8ba..abf532318f13 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/DefaultGroovyScriptRunner.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/DefaultGroovyScriptRunner.java @@ -97,7 +97,9 @@ public class DefaultGroovyScriptRunner extends GroovyScriptRunner { if (groovyHome != null) { groovyHome = FileUtil.toSystemDependentName(groovyHome); } - setGroovyHome(params, groovyHome); + if (groovyHome != null) { + setGroovyHome(params, groovyHome); + } final String confPath = getConfPath(groovyHome); params.getVMParametersList().add("-Dgroovy.starter.conf=" + confPath); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunner.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunner.java index 8e91bc7d33dd..87ee64a6fff9 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunner.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunner.java @@ -79,7 +79,7 @@ public abstract class GroovyScriptRunner { } } - protected static void setGroovyHome(JavaParameters params, String groovyHome) { + protected static void setGroovyHome(JavaParameters params, @NotNull String groovyHome) { params.getVMParametersList().add("-Dgroovy.home=" + groovyHome); if (groovyHome.contains("grails")) { //a bit of a hack params.getVMParametersList().add("-Dgrails.home=" + groovyHome); From 9468543033da408ff88e172e24ed80dc68ba53a7 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 7 Mar 2013 19:59:10 +0100 Subject: [PATCH 34/57] diagnose different control flows in different passes (EA-28732) --- .../dataFlow/ControlFlowAnalyzer.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java index 0a92e0091f18..2f6b65045bd4 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -35,14 +35,9 @@ import com.intellij.util.containers.Stack; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; -import static com.intellij.psi.CommonClassNames.JAVA_LANG_ERROR; -import static com.intellij.psi.CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION; -import static com.intellij.psi.CommonClassNames.JAVA_LANG_THROWABLE; +import static com.intellij.psi.CommonClassNames.*; class ControlFlowAnalyzer extends JavaElementVisitor { private static final Logger LOG = Logger.getInstance("#com.intellij.codeInspection.dataFlow.ControlFlowAnalyzer"); @@ -91,7 +86,9 @@ class ControlFlowAnalyzer extends JavaElementVisitor { pass2Flow.setFields(myFields.toArray(new DfaVariableValue[myFields.size()])); - LOG.assertTrue(myPass1Flow.getInstructionCount() == pass2Flow.getInstructionCount()); + if (myPass1Flow.getInstructionCount() != pass2Flow.getInstructionCount()) { + LOG.error(Arrays.toString(myPass1Flow.getInstructions()) + "!=\n" + Arrays.toString(pass2Flow.getInstructions())); + } addInstruction(new ReturnInstruction()); From 5f771a3bf39e76ba2c4ebd6a6e0c44f5aac5f3a4 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 7 Mar 2013 20:01:58 +0100 Subject: [PATCH 35/57] be prepared to SOE in CompositeElement.diagnoseTextInconsistency (EA-39738) --- .../intellij/psi/impl/source/tree/CompositeElement.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java b/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java index 64b9dd179b45..da9e0c80e839 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java @@ -317,7 +317,12 @@ public class CompositeElement extends TreeElement { @NonNls String msg = ""; msg += ";\n changed=" + (startStamp != myModificationsCount); msg += ";\n buffer=" + text; - msg += ";\n this=" + this; + try { + msg += ";\n this=" + this; + } + catch (StackOverflowError e) { + msg += ";\n this.toString produces SOE"; + } int shitStart = textMatches(text, 0); msg += ";\n matches until " + shitStart; LeafElement leaf = findLeafElementAt(Math.abs(shitStart)); From 7e804ced9e9fc7f43ef777f5f4e4dba2ece83924 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 7 Mar 2013 20:23:23 +0100 Subject: [PATCH 36/57] CodeCompletionHandlerBase: extract some methods --- .../completion/CodeCompletionHandlerBase.java | 97 ++++++++++--------- 1 file changed, 50 insertions(+), 47 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java index d6b6991f7fc6..bdce68b79eb0 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -126,10 +126,8 @@ public class CodeCompletionHandlerBase { CompletionLookupArranger.applyLastCompletionStatisticsUpdate(); } - final Document document = editor.getDocument(); - if (!CodeInsightUtilBase.prepareEditorForWrite(editor)) return; - - if (!FileDocumentManager.getInstance().requestWriting(document, project)) { + if (!CodeInsightUtilBase.prepareEditorForWrite(editor) || + !FileDocumentManager.getInstance().requestWriting(editor.getDocument(), project)) { return; } @@ -164,56 +162,16 @@ public class CodeCompletionHandlerBase { Runnable initCmd = new Runnable() { @Override public void run() { - Runnable runnable = new Runnable() { @Override public void run() { - final PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project); - EditorUtil.fillVirtualSpaceUntilCaret(editor); - documentManager.commitAllDocuments(); - - int docLength = editor.getDocument().getTextLength(); - int psiLength = psiFile.getTextLength(); - if (docLength != psiLength) { - if (ApplicationManagerEx.getApplicationEx().isInternal()) { - String docText = editor.getDocument().getText(); - String psiText = psiFile.getText(); - String message = "unsuccessful commit: (injected=" +(editor instanceof EditorWindow) +"); document " + System.identityHashCode(editor.getDocument()) + "; " + - "docText=\n'" + docText +"' (" + docText.length() +" chars; .length()="+ docLength+")\n" + - "; fileText=\n'" + psiText + "' (" + psiText.length() +" chars; .length()="+ psiLength+")\n" - ; - throw new AssertionError(message); - } - - throw new AssertionError("unsuccessful commit: injected=" + (editor instanceof EditorWindow)); - } + PsiDocumentManager.getInstance(project).commitAllDocuments(); + assertCommitSuccessful(editor, psiFile); checkEditorValid2(editor); - final Ref current = Ref.create(null); - initializationContext[0] = new CompletionInitializationContext(editor, psiFile, myCompletionType) { - CompletionContributor dummyIdentifierChanger; - @Override - public void setFileCopyPatcher(@NotNull FileCopyPatcher fileCopyPatcher) { - super.setFileCopyPatcher(fileCopyPatcher); - - if (dummyIdentifierChanger != null) { - LOG.error("Changing the dummy identifier twice, already changed by " + dummyIdentifierChanger); - } - dummyIdentifierChanger = current.get(); - } - }; - for (final CompletionContributor contributor : CompletionContributor.forLanguage(initializationContext[0].getPositionLanguage())) { - if (DumbService.getInstance(project).isDumb() && !DumbService.isDumbAware(contributor)) { - continue; - } - - current.set(contributor); - contributor.beforeCompletion(initializationContext[0]); - checkEditorValid2(editor); - assert !documentManager.isUncommited(document) : "Contributor " + contributor + " left the document uncommitted"; - } + initializationContext[0] = runContributorsBeforeCompletion(editor, psiFile); } }; ApplicationManager.getApplication().runWriteAction(runnable); @@ -231,6 +189,51 @@ public class CodeCompletionHandlerBase { insertDummyIdentifier(initializationContext[0], hasModifiers, time); } + private CompletionInitializationContext runContributorsBeforeCompletion(Editor editor, PsiFile psiFile) { + final Ref current = Ref.create(null); + CompletionInitializationContext context = new CompletionInitializationContext(editor, psiFile, myCompletionType) { + CompletionContributor dummyIdentifierChanger; + + @Override + public void setFileCopyPatcher(@NotNull FileCopyPatcher fileCopyPatcher) { + super.setFileCopyPatcher(fileCopyPatcher); + + if (dummyIdentifierChanger != null) { + LOG.error("Changing the dummy identifier twice, already changed by " + dummyIdentifierChanger); + } + dummyIdentifierChanger = current.get(); + } + }; + List contributors = CompletionContributor.forLanguage(context.getPositionLanguage()); + Project project = psiFile.getProject(); + List filteredContributors = DumbService.getInstance(project).filterByDumbAwareness(contributors); + for (final CompletionContributor contributor : filteredContributors) { + current.set(contributor); + contributor.beforeCompletion(context); + checkEditorValid2(editor); + assert !PsiDocumentManager.getInstance(project).isUncommited(editor.getDocument()) : "Contributor " + contributor + " left the document uncommitted"; + } + return context; + } + + private static void assertCommitSuccessful(Editor editor, PsiFile psiFile) { + int docLength = editor.getDocument().getTextLength(); + int psiLength = psiFile.getTextLength(); + if (docLength != psiLength) { + if (ApplicationManagerEx.getApplicationEx().isInternal()) { + String docText = editor.getDocument().getText(); + String psiText = psiFile.getText(); + String message = "unsuccessful commit: (injected=" +(editor instanceof EditorWindow) +"); document " + System.identityHashCode(editor.getDocument()) + "; " + + "docText=\n'" + docText +"' (" + docText.length() +" chars; .length()="+ docLength+")\n" + + "; fileText=\n'" + psiText + "' (" + psiText.length() +" chars; .length()="+ psiLength+")\n" + ; + throw new AssertionError(message); + } + + throw new AssertionError("unsuccessful commit: injected=" + (editor instanceof EditorWindow)); + } + } + private static void checkEditorValid2(Editor editor) { if (editor instanceof EditorWindow && !((EditorWindow)editor).isValid()) { throw new AssertionError(); From 0bae9a22f62e23252b876a7cf23a7e3703dcd6cb Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 7 Mar 2013 21:22:02 +0100 Subject: [PATCH 37/57] CodeCompletionHandlerBase: minor --- .../completion/CodeCompletionHandlerBase.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java index bdce68b79eb0..3cadaf0a5f0c 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -298,11 +298,11 @@ public class CodeCompletionHandlerBase { boolean hasModifiers, int invocationCount, PsiFile hostFile, - int hostStartOffset, Editor hostEditor, OffsetMap hostMap, OffsetTranslator translator) { + Editor hostEditor, OffsetMap hostMap, OffsetTranslator translator) { final Editor editor = initContext.getEditor(); checkEditorValid2(editor); - CompletionContext context = createCompletionContext(hostFile, hostStartOffset, hostEditor, hostMap); + CompletionContext context = createCompletionContext(hostFile, hostMap.getOffset(CompletionInitializationContext.START_OFFSET), hostEditor, hostMap); CompletionParameters parameters = createCompletionParameters(invocationCount, context, editor); CompletionPhase phase = CompletionServiceImpl.getCompletionPhase(); @@ -506,7 +506,6 @@ public class CodeCompletionHandlerBase { }); final PsiFile hostFile = InjectedLanguageUtil.getTopLevelFile(fileCopy[0]); final InjectedLanguageManager injectedLanguageManager = InjectedLanguageManager.getInstance(hostFile.getProject()); - final int hostStartOffset = injectedLanguageManager.injectedToHost(fileCopy[0], initContext.getStartOffset()); final Editor hostEditor = InjectedLanguageUtil.getTopLevelEditor(initContext.getEditor()); final OffsetMap hostMap = new OffsetMap(hostEditor.getDocument()); @@ -553,14 +552,14 @@ public class CodeCompletionHandlerBase { Disposer.dispose(translator); return; } - doComplete(initContext, hasModifiers, invocationCount, hostFile, hostStartOffset, hostEditor, hostMap, translator); + doComplete(initContext, hasModifiers, invocationCount, hostFile, hostEditor, hostMap, translator); } }); } else { PsiDocumentManager.getInstance(hostFile.getProject()).commitDocument(hostDocument); - doComplete(initContext, hasModifiers, invocationCount, hostFile, hostStartOffset, hostEditor, hostMap, translator); + doComplete(initContext, hasModifiers, invocationCount, hostFile, hostEditor, hostMap, translator); } } From 8ef855248fb24b97cc8bd708a3a3e24d3f3dcc1d Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 7 Mar 2013 21:25:28 +0100 Subject: [PATCH 38/57] CodeCompletionHandlerBase: extract some methods --- .../completion/CodeCompletionHandlerBase.java | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java index 3cadaf0a5f0c..b2a683c691bf 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -505,14 +505,9 @@ public class CodeCompletionHandlerBase { } }); final PsiFile hostFile = InjectedLanguageUtil.getTopLevelFile(fileCopy[0]); - final InjectedLanguageManager injectedLanguageManager = InjectedLanguageManager.getInstance(hostFile.getProject()); final Editor hostEditor = InjectedLanguageUtil.getTopLevelEditor(initContext.getEditor()); - final OffsetMap hostMap = new OffsetMap(hostEditor.getDocument()); - final OffsetMap original = initContext.getOffsetMap(); - for (final OffsetKey key : original.getAllOffsets()) { - hostMap.addOffset(key, injectedLanguageManager.injectedToHost(fileCopy[0], original.getOffset(key))); - } + final OffsetMap hostMap = translateOffsetMapToHost(initContext, fileCopy[0], hostFile, hostEditor); final Document document = fileCopy[0].getViewProvider().getDocument(); assert document != null : "no document"; @@ -563,6 +558,19 @@ public class CodeCompletionHandlerBase { } } + private OffsetMap translateOffsetMapToHost(CompletionInitializationContext initContext, + PsiFile context, + PsiFile hostFile, + Editor hostEditor) { + final InjectedLanguageManager injectedLanguageManager = InjectedLanguageManager.getInstance(hostFile.getProject()); + final OffsetMap hostMap = new OffsetMap(hostEditor.getDocument()); + final OffsetMap original = initContext.getOffsetMap(); + for (final OffsetKey key : original.getAllOffsets()) { + hostMap.addOffset(key, injectedLanguageManager.injectedToHost(context, original.getOffset(key))); + } + return hostMap; + } + private static CompletionContext createCompletionContext(PsiFile hostFile, int hostStartOffset, Editor hostEditor, @@ -583,11 +591,8 @@ public class CodeCompletionHandlerBase { EditorWindow injectedEditor = (EditorWindow)InjectedLanguageUtil .getEditorForInjectedLanguageNoCommit(hostEditor, hostFile, hostStartOffset); assert injected == injectedEditor.getInjectedFile(); - final OffsetMap map = new OffsetMap(injectedEditor.getDocument()); - for (final OffsetKey key : hostMap.getAllOffsets()) { - map.addOffset(key, injectedEditor.logicalPositionToOffset(injectedEditor.hostToInjected(hostEditor.offsetToLogicalPosition(hostMap.getOffset(key))))); - } - context = new CompletionContext(hostFile.getProject(), injectedEditor, injected, map); + context = new CompletionContext(hostFile.getProject(), injectedEditor, injected, + translateOffsetMapToInjected(hostEditor, hostMap, injectedEditor)); assert hostStartOffset == injectedLanguageManager.injectedToHost(injected, context.getStartOffset()) : "inconsistent injected offset translation"; } else { context = new CompletionContext(hostFile.getProject(), hostEditor, hostFile, hostMap); @@ -599,6 +604,14 @@ public class CodeCompletionHandlerBase { return context; } + private static OffsetMap translateOffsetMapToInjected(Editor hostEditor, OffsetMap hostMap, EditorWindow injectedEditor) { + final OffsetMap map = new OffsetMap(injectedEditor.getDocument()); + for (final OffsetKey key : hostMap.getAllOffsets()) { + map.addOffset(key, injectedEditor.logicalPositionToOffset(injectedEditor.hostToInjected(hostEditor.offsetToLogicalPosition(hostMap.getOffset(key))))); + } + return map; + } + private boolean isAutocompleteCommonPrefixOnInvocation() { return invokedExplicitly && CodeInsightSettings.getInstance().AUTOCOMPLETE_COMMON_PREFIX; } From 32d320aac7d37bf59428f4d656c7f9a174f99907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yann=20C=C3=A9bron?= Date: Fri, 8 Mar 2013 08:53:44 +0100 Subject: [PATCH 39/57] EA-40210 - NPE: XmlUtil.findNamespacePrefixByURI --- xml/impl/src/com/intellij/xml/util/XmlUtil.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xml/impl/src/com/intellij/xml/util/XmlUtil.java b/xml/impl/src/com/intellij/xml/util/XmlUtil.java index e9c8abd6c2ba..22f68453b560 100644 --- a/xml/impl/src/com/intellij/xml/util/XmlUtil.java +++ b/xml/impl/src/com/intellij/xml/util/XmlUtil.java @@ -197,15 +197,15 @@ public class XmlUtil { } @Nullable - public static String findNamespacePrefixByURI(XmlFile file, @NonNls String uri) { + public static String findNamespacePrefixByURI(XmlFile file, @NotNull @NonNls String uri) { final XmlTag tag = file.getRootTag(); if (tag == null) return null; for (XmlAttribute attribute : tag.getAttributes()) { - if (attribute.getName().startsWith("xmlns:") && attribute.getValue().equals(uri)) { + if (attribute.getName().startsWith("xmlns:") && uri.equals(attribute.getValue())) { return attribute.getName().substring("xmlns:".length()); } - if ("xmlns".equals(attribute.getName()) && attribute.getValue().equals(uri)) return ""; + if ("xmlns".equals(attribute.getName()) && uri.equals(attribute.getValue())) return ""; } return null; From 4754c9007fe31340f438ac16aace3c895538d361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yann=20C=C3=A9bron?= Date: Fri, 8 Mar 2013 08:58:23 +0100 Subject: [PATCH 40/57] XmlAttribute#getValue|getDisplayValue are @Nullable --- xml/openapi/src/com/intellij/psi/xml/XmlAttribute.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/xml/openapi/src/com/intellij/psi/xml/XmlAttribute.java b/xml/openapi/src/com/intellij/psi/xml/XmlAttribute.java index 0ba6a7ef2719..442e53a46354 100644 --- a/xml/openapi/src/com/intellij/psi/xml/XmlAttribute.java +++ b/xml/openapi/src/com/intellij/psi/xml/XmlAttribute.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2013 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. @@ -42,11 +42,13 @@ public interface XmlAttribute extends XmlElement, PsiNamedElement { /** * @return text inside XML attribute with quotes stripped off */ + @Nullable String getValue(); /** * @return text inside XML attribute with quotes stripped off and XML char entities replaced with corresponding characters */ + @Nullable String getDisplayValue(); /** From 8ac3b416f9b35cd15990b613ef7aafccce26b54e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yann=20C=C3=A9bron?= Date: Fri, 8 Mar 2013 08:58:46 +0100 Subject: [PATCH 41/57] XmlAttribute#getValue|getDisplayValue are @Nullable: fix some potential NPEs --- .../daemon/impl/analysis/AddSchemaPrefixIntention.java | 6 +++--- .../analysis/ConvertSchemaPrefixToDefaultIntention.java | 3 ++- xml/impl/src/com/intellij/xml/DefaultXmlExtension.java | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/AddSchemaPrefixIntention.java b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/AddSchemaPrefixIntention.java index e7d65657d0b4..723ba6e14fa6 100644 --- a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/AddSchemaPrefixIntention.java +++ b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/AddSchemaPrefixIntention.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2013 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. @@ -86,7 +86,7 @@ public class AddSchemaPrefixIntention extends PsiElementBaseIntentionAction { tag.accept(new XmlRecursiveElementVisitor() { @Override public void visitXmlTag(XmlTag tag) { - if (namespace.equals(tag.getNamespace()) && tag.getNamespacePrefix().length() == 0) { + if (tag.getNamespace().equals(namespace) && tag.getNamespacePrefix().length() == 0) { tags.add(tag); } super.visitXmlTag(tag); @@ -109,7 +109,7 @@ public class AddSchemaPrefixIntention extends PsiElementBaseIntentionAction { if (xmlElement instanceof XmlElement) { final XmlTag tag = PsiTreeUtil.getParentOfType(xmlElement, XmlTag.class, false); if (tag != null) { - if (namespace.equals(tag.getNamespace())) { + if (tag.getNamespace().equals(namespace)) { if (ref.getRangeInElement().getLength() == value.getValue().length()) { //no ns prefix values.add(value); } diff --git a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/ConvertSchemaPrefixToDefaultIntention.java b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/ConvertSchemaPrefixToDefaultIntention.java index 34c4809aa811..adfec6974ebc 100644 --- a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/ConvertSchemaPrefixToDefaultIntention.java +++ b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/ConvertSchemaPrefixToDefaultIntention.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2013 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. @@ -92,6 +92,7 @@ public class ConvertSchemaPrefixToDefaultIntention extends PsiElementBaseIntenti } } for (XmlAttribute attr : attrs) { + //noinspection ConstantConditions attr.setValue(attr.getValue().substring(index)); } xmlns.setName("xmlns"); diff --git a/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java b/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java index f024e874b2e7..8d5d28bd9809 100644 --- a/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java +++ b/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2013 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. @@ -229,7 +229,7 @@ public class DefaultXmlExtension extends XmlExtension { rootTag.add(xmlAttribute); } else { final String value = xmlAttribute.getValue(); - if (!value.contains(namespace)) { + if (value != null && !value.contains(namespace)) { if (StringUtil.isEmptyOrSpaces(value)) { xmlAttribute.setValue(pair); } else { From 79340453f864ea792f3b5685e5ad5db079efe7c1 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Fri, 8 Mar 2013 10:40:16 +0100 Subject: [PATCH 42/57] copy to should be the first option after merge --- .../com/intellij/openapi/diff/impl/dir/DirDiffElementImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffElementImpl.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffElementImpl.java index fa514f79e036..5cf102f6c260 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffElementImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffElementImpl.java @@ -214,7 +214,7 @@ public class DirDiffElementImpl implements DirDiffElement { } else if (myType == DiffType.TARGET) { myOperation = op == COPY_FROM ? DELETE : op == DELETE ? NONE : COPY_FROM; } else if (myType == DiffType.CHANGED) { - myOperation = op == MERGE ? COPY_FROM : op == COPY_FROM ? COPY_TO : MERGE; + myOperation = op == MERGE ? COPY_TO : op == COPY_TO ? COPY_FROM : MERGE; } } From b343497c8ac8e3b6ae4e8e584a051f85ceb8c546 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Fri, 8 Mar 2013 10:41:10 +0100 Subject: [PATCH 43/57] debugger icons update --- .../debugger/actions/force_run_to_cursor.png | Bin 323 -> 277 bytes .../debugger/actions/force_run_to_cursor@2x.png | Bin 0 -> 383 bytes .../src/debugger/actions/force_step_into.png | Bin 451 -> 408 bytes .../src/debugger/actions/force_step_into@2x.png | Bin 0 -> 686 bytes .../src/debugger/actions/force_step_over.png | Bin 526 -> 429 bytes .../src/debugger/actions/force_step_over@2x.png | Bin 0 -> 824 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 platform/icons/src/debugger/actions/force_run_to_cursor@2x.png create mode 100644 platform/icons/src/debugger/actions/force_step_into@2x.png create mode 100644 platform/icons/src/debugger/actions/force_step_over@2x.png diff --git a/platform/icons/src/debugger/actions/force_run_to_cursor.png b/platform/icons/src/debugger/actions/force_run_to_cursor.png index 065d3b7d0e7568aa8c3bc5ad4dfe8e51274b7cfe..ac4257c281697d3568646d89f71532c0f12c4dd0 100644 GIT binary patch delta 212 zcmV;_04x8)0+j-gNq@IVL_t(|+G70w|3AY?8?7`3>|hp*VSeNqRs}3b?3wrszy(;) z_>2rB0wx9u0mTNe;FJ9R_aB^nz)}N6&f)kCye_aMHau_{FcpZsIGLH4q5S_)jLybs zfG!YE0^)F>A?#4sFhVslBD)UV0A$mZfVc{Xorn#@bhJeE6itXH0P#U$3_wqDML=8) z#2bMz@rRsf1i9uAQ1gFs)4@TK5)!VQhLm{zBjpujHUlFlJ5vGx0t^7zwJ)rH?UjK5 O0000c83Nq^-@L_t(|+G70w|3AaK#TNe=uz*X`J}`o4y(|F+q1Y4HlrXR$ zDP|xCu%Pi7Ni~3pfkHsB0W8EQ0*B8u4HPkl<2P`-KqrlV0x;y6$o9gco!|2R{`$WP zXb3x0=sy&rv#}fS>EUmN`&+&S|M~WRFVGM{XzVaTH8LW{7JIq@aMQoN_`~pc-&boO zb16}Q2uf|pfyN=s%ph&YbqUB#CTIXG$-)4SG|PWEH|`xQoQxqrxvwM#qJkIqG@xc5 zLYi@=gDbN?W|NeVV2J`99I(_t4qOJLn1JUSMo@O91ONmW0Fd8Kh{N!TlmGw#07*qo IM6N<$f?JMsEC2ui diff --git a/platform/icons/src/debugger/actions/force_run_to_cursor@2x.png b/platform/icons/src/debugger/actions/force_run_to_cursor@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8e23e6d60cf584a287e076d0dfe40346ad1739aa GIT binary patch literal 383 zcmV-_0f7FAP)};Y5l9T7lRTh*@#S|3||0NaFQqa%4w=0}zV?aR(5u1>&!G)HdK?Q=A4g zfw&8ZMS*w$5WmG!cl;-&P9Y~3fI^`Oh%10tj+SZQKc2Yb0^%YdZs%lX(jLfifRWOi zfh`TB<4}v-Qu+qO(}8$0upD?uO$Xp>X2Bfr3W&Rbcs^Ppq)SP7oycrR69*iG`g|7< z{~n0Cpc;seVJpq(<$$9!uMNrRTo79e4&U|wma-oP8gYm-(#iqomN%eP$=Hk1f$kj- dcp3l*FaYBeLE~JsuV4TG002ovPDHLkV1i7inA!jU literal 0 HcmV?d00001 diff --git a/platform/icons/src/debugger/actions/force_step_into.png b/platform/icons/src/debugger/actions/force_step_into.png index 94394f2a0a556ba863caa1f68923ab3286f74b21..097c92a8b7adeb154da4bd3871758302cf34ccda 100644 GIT binary patch delta 315 zcmV-B0mS~p1DFGlNq;&?L_t(|+G70w|33pIfCWUHw9!fQ^Q_8bERZKztoZGsu+}f!G_S7oP$DfOs1aHv{ogsMviVZUW++P=Bm)bS-GlM?|Ve<%Nk|O8e*9|u{p%0V1xOgk z|Ml}%Gf@VdYzSNZ^V^SzKR^Fm|NHCDZx9XQpR5mCNmMKl0{{XH08~4Ea}C)%4Wb&QORszA&3|MmIX zv`(&j6^aXR0g>t=e=rP~SeP4F*nyhaSQr>tnZY!e&%#_sFd88yFsl9o#ntbBa3L^@ ziAj|x1OEQ~fBX0EzuJt92m?S~{`>deZMYry4EXiqSL5$re}FDP!a)A7pTC-kGT>xG z*y^9(enkBF`RDrIUw?jsXb}Hoeb`E(Vu2U{5MThFN}pli59txV00000NkvXXu0mjf D6VKh|gFO@x)Jol* zy!g*H!cew$N3$%&z>mo$PxAbedGchIS!=16g;S49&jm!;AB&}<7Xr^ewYlNg+|t$p ze7PUU`NbU_1789AOa8A@Py(-j&5(_y-)*nGZEykeU>q#}!N&DXc-!Ct-0EI}>tMA_ z|EhQXV$<#fjR6Jfekay5?XG?U)Ii$pAp8LyfxEzX?tzECud__}kL3%v0}lA(c-yy8 z9syJB(r1qH5sYQ(lvhBAvXsY|h4>ygS)JL3#|StLj`-$x;3=4VQz?J$nt)QZR%VPn z;DYZJoD<_4+1MIO+88q0e1nhkbCskXT)@C+EfIoG%Q#|%xIj`y1R~uS_3|q*&gyJ1zo}1?OB4XB#_UFmFplGo_#F4ab^F_2IYGp_MRs zfYXSKWwEd)rYM#~Sh+#6Q`WR_brOsO`kalk#h6RM5|I#MP-5HhY^@es+!nXP&c@pg z20Mm45`7Forx9#qwttPz7Gn+t6Tk#d;Wl!S-s!D{G0k8C@S5KnWBWT zjwtWXGY0n0f(2o!^i8GontKJE;B3LIU;-AemOrUf4P#Z-o%e09usw${E5TFoiLob% zOU0-bw=nq*AH(yP&&+h~G8(v6-wzQk$(#axK>EvQ7V}RoTshml%V@{{IsGNT0D#py UJiE1o5dZ)H07*qoM6N<$g6g?G2LJ#7 literal 0 HcmV?d00001 diff --git a/platform/icons/src/debugger/actions/force_step_over.png b/platform/icons/src/debugger/actions/force_step_over.png index fe313305fdbe82f6e0649c1d16d9628421830306..b1353864382c95bcab0c54fe2d1f230e091dc2fb 100644 GIT binary patch delta 365 zcmV-z0h0cX1g!&*Nq{AtxmbJy6|eQGM4v$Kf(R|t zXz(tA2YrJ?6uf&-@RBF+kh5oRrP-fsXM$;>tZj-PeC*E7?BtuxM~yKg*<2^HaMlZb zhdV<`sR#9`R{HXFuoq*FkvTZ+h5K&XjXEps?(%BK#TDc2tA9ry^ZdK+=#TsNj5`5u zxrDi#fC9n{Biz83r5-{)=C$HGTLZ$Vm%~QNe0o^y81w21O3>dOv^J@fx=U%*0N+jP zJZ;Y{ifkj4ve$rp;MXEPIIbD$6L<}L zo96>QbzFrL-~jjxROkcBSWH>vF_W8_K0qZ;c)5uWD9ZT{CISoq@kzTuTjwfE00000 LNkvXXu0mjf|JJQ* delta 463 zcmV;=0Wkip1C9icNq?|OL_t(|+N4rDO9Md=-rZX-FP~TjM38_Gu~vj&r64K9glI2V z*a$)@Ax0&wSmh6hMH1`;wNQdx+B6m^#MoGg2#J@y+goSXxnGmk>gkk5wG75M0vFb}#ShDSiK6_6We4T?>3^QZnRqVg59lSIUq^%x zWZO1s84MZkZ2b;ER0p%$qn>kA^RJjtElYh+tWyLXAR-8&kWEaUfs{{xcCvR11V?Nz zrfEAz$|EG=?7$`Xdp+l(W|};TaTh?2&ADAuIDc)K8SKDh7IffJh*^sr^#yP_bzEvS zjSZ`1-E(G{(tpahvY#q=jo>MjtV%BQaM+~G_V z;c0y`UahB-dO$A(hXT>ia8Q?4#xVf(1bBNi(ZfX}VKv1KfQ)_N!GNZ$ilHMf07aQl%1$VQ}14t;g9F=j02ed=k4$xqjiixGr z6%F7doHy7qJHUh#G3jzl*rGQNCRajvD2~hGet7U9zyRaV^zy@rLhAqk002ovPDHLk FV1k5;)foT) diff --git a/platform/icons/src/debugger/actions/force_step_over@2x.png b/platform/icons/src/debugger/actions/force_step_over@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..47f2b4382870a14770e43e97590b638c981e9505 GIT binary patch literal 824 zcmV-81IPS{P)%w}f4*ga?! zJa{Ph39?6}R1j}M5wvX4YY)|nD1x9au4VB9)PtxX7SyBCx|f39#kSa!7e9Kag4bd% zTdM8OB=P_DL$-B4X5DEQ1HYM&yyU$k?v}RiA0`v?|Wry;C8_+j8K4@8DLOLOC zJ2sOt#9&CN4~m)VdaSroWNy(jO6l~>=vpKG7%2+$Yi5{dbP1|c8}*S4 z$zsffMou`=hUzi;SeA7hlhU8jPAb*-I7xod<>D5M2@T46Bu-$v%ad0$4``vO7 z7Z#1#6Id8>ayFbddAgrs%43Rt4B);dG;B_5lk&6rnlax3+X18WBtk9aUpYmEe!bR@ zJ1DNF9(kTB&=L3o7ZT*}2WG(R_4I=0dc#UbRU81YE z0ZWiclkDGDNdRR!bK;fuR4;tuHuwl!unazc8`@R9kjXcFjBpi?)Z7EUqTt}v=Z=jJ zWC#B1e4y11^!Ygs$_F4dFGAu9Uc>`-SULpiDYRWf-`A4NKNxTm90RghKEOHU12P$j zMOZ8mWAS9X1l6fc+A={hB-^e5N5DOB8pPIj9?HJ#5f*>uL~I^~q6nT`J8U!CmSs?< zwrD)UNQPuFW?Q>XxDVU`XTg@B^8vq6upQ*UWw5j6jbE1!=( Date: Fri, 8 Mar 2013 10:41:42 +0100 Subject: [PATCH 44/57] retina icons --- platform/icons/src/actions/GroupByModule.png | Bin 309 -> 309 bytes .../src/actions/GroupByModule@2x_dark.png | Bin 659 -> 653 bytes .../icons/src/actions/GroupByModuleGroup.png | Bin 217 -> 423 bytes .../src/actions/GroupByModuleGroup@2x.png | Bin 0 -> 763 bytes .../src/actions/GroupByModuleGroup@2x_dark.png | Bin 0 -> 779 bytes .../src/actions/GroupByModuleGroup_dark.png | Bin 0 -> 430 bytes platform/icons/src/actions/GroupByPackage.png | Bin 389 -> 388 bytes .../icons/src/actions/GroupByPackage@2x.png | Bin 0 -> 809 bytes .../src/actions/GroupByPackage@2x_dark.png | Bin 0 -> 811 bytes .../icons/src/actions/GroupByPackage_dark.png | Bin 399 -> 402 bytes .../icons/src/actions/GroupByPrefix@2x.png | Bin 712 -> 711 bytes .../src/actions/GroupByPrefix@2x_dark.png | Bin 731 -> 771 bytes platform/icons/src/actions/back.png | Bin 512 -> 506 bytes platform/icons/src/actions/cancel.png | Bin 489 -> 508 bytes platform/icons/src/actions/checkOut@2x.png | Bin 1132 -> 982 bytes platform/icons/src/actions/checkOut_dark.png | Bin 478 -> 481 bytes platform/icons/src/actions/clean.png | Bin 475 -> 458 bytes platform/icons/src/actions/clean@2x.png | Bin 0 -> 1007 bytes platform/icons/src/actions/clean@2x_dark.png | Bin 0 -> 984 bytes platform/icons/src/actions/cleanLight.png | Bin 451 -> 452 bytes platform/icons/src/actions/cleanLight@2x.png | Bin 0 -> 946 bytes .../icons/src/actions/cleanLight@2x_dark.png | Bin 0 -> 993 bytes platform/icons/src/actions/cleanLight_dark.png | Bin 0 -> 455 bytes platform/icons/src/actions/clean_dark.png | Bin 0 -> 461 bytes platform/icons/src/actions/closeNew.png | Bin 343 -> 334 bytes platform/icons/src/actions/closeNew@2x.png | Bin 355 -> 466 bytes .../icons/src/actions/closeNew@2x_dark.png | Bin 425 -> 449 bytes platform/icons/src/actions/closeNewHovered.png | Bin 347 -> 349 bytes .../icons/src/actions/closeNewHovered@2x.png | Bin 553 -> 578 bytes .../src/actions/closeNewHovered@2x_dark.png | Bin 429 -> 436 bytes .../icons/src/actions/closeNewHovered_dark.png | Bin 365 -> 356 bytes platform/icons/src/actions/closeNew_dark.png | Bin 352 -> 358 bytes platform/icons/src/actions/commit.png | Bin 471 -> 463 bytes platform/icons/src/actions/commit@2x.png | Bin 0 -> 1079 bytes platform/icons/src/actions/compile_dark.png | Bin 393 -> 396 bytes platform/icons/src/actions/createPatch@2x.png | Bin 0 -> 844 bytes platform/icons/src/actions/cross.png | Bin 128 -> 196 bytes platform/icons/src/actions/cross@2x.png | Bin 0 -> 296 bytes platform/icons/src/actions/cross@2x_dark.png | Bin 0 -> 297 bytes platform/icons/src/actions/cross_dark.png | Bin 0 -> 197 bytes platform/icons/src/actions/delete.png | Bin 508 -> 489 bytes platform/icons/src/actions/diff@2x.png | Bin 0 -> 1118 bytes platform/icons/src/actions/diff@2x_dark.png | Bin 0 -> 1001 bytes platform/icons/src/actions/diffWithCurrent.png | Bin 406 -> 411 bytes .../icons/src/actions/diffWithCurrent@2x.png | Bin 0 -> 712 bytes .../src/actions/diffWithCurrent@2x_dark.png | Bin 0 -> 821 bytes .../icons/src/actions/diffWithCurrent_dark.png | Bin 0 -> 428 bytes platform/icons/src/actions/diff_dark.png | Bin 485 -> 483 bytes platform/icons/src/actions/download@2x.png | Bin 787 -> 779 bytes platform/icons/src/actions/dump@2x.png | Bin 0 -> 1171 bytes platform/icons/src/actions/dump@2x_dark.png | Bin 0 -> 1272 bytes platform/icons/src/actions/dump_dark.png | Bin 0 -> 505 bytes platform/icons/src/actions/edit.png | Bin 358 -> 336 bytes platform/icons/src/actions/edit@2x.png | Bin 0 -> 656 bytes platform/icons/src/actions/edit@2x_dark.png | Bin 0 -> 708 bytes platform/icons/src/actions/editSource.png | Bin 528 -> 474 bytes platform/icons/src/actions/editSource@2x.png | Bin 0 -> 920 bytes .../icons/src/actions/editSource@2x_dark.png | Bin 0 -> 956 bytes platform/icons/src/actions/editSource_dark.png | Bin 0 -> 479 bytes platform/icons/src/actions/edit_dark.png | Bin 0 -> 338 bytes platform/icons/src/actions/erDiagram.png | Bin 252 -> 283 bytes platform/icons/src/actions/erDiagram@2x.png | Bin 0 -> 434 bytes .../icons/src/actions/erDiagram@2x_dark.png | Bin 0 -> 431 bytes platform/icons/src/actions/erDiagram_dark.png | Bin 0 -> 291 bytes platform/icons/src/actions/exclude@2x.png | Bin 0 -> 192 bytes platform/icons/src/actions/execute.png | Bin 473 -> 460 bytes platform/icons/src/actions/exit@2x.png | Bin 0 -> 845 bytes platform/icons/src/actions/exit@2x_dark.png | Bin 0 -> 884 bytes platform/icons/src/actions/exit_dark.png | Bin 0 -> 473 bytes platform/icons/src/actions/export@2x.png | Bin 0 -> 1007 bytes platform/icons/src/actions/filter_small@2x.png | Bin 0 -> 801 bytes .../icons/src/actions/filter_small@2x_dark.png | Bin 0 -> 848 bytes .../icons/src/actions/filter_small_dark.png | Bin 0 -> 423 bytes platform/icons/src/actions/gc@2x.png | Bin 0 -> 846 bytes platform/icons/src/actions/gc@2x_dark.png | Bin 0 -> 849 bytes platform/icons/src/actions/gc_dark.png | Bin 0 -> 464 bytes platform/icons/src/actions/get.png | Bin 479 -> 471 bytes platform/icons/src/actions/get@2x.png | Bin 0 -> 1088 bytes .../icons/src/actions/groupByMethod@2x.png | Bin 0 -> 1242 bytes .../src/actions/groupByMethod@2x_dark.png | Bin 0 -> 1259 bytes .../icons/src/actions/groupByMethod_dark.png | Bin 509 -> 511 bytes .../src/actions/groupByTestProduction.png | Bin 316 -> 316 bytes .../src/actions/groupByTestProduction@2x.png | Bin 0 -> 643 bytes .../actions/groupByTestProduction@2x_dark.png | Bin 0 -> 642 bytes .../src/actions/groupByTestProduction_dark.png | Bin 355 -> 319 bytes platform/icons/src/actions/install@2x.png | Bin 0 -> 779 bytes platform/icons/src/actions/menu-cut.png | Bin 552 -> 557 bytes platform/icons/src/actions/menu-cut_dak.png | Bin 0 -> 554 bytes platform/icons/src/actions/menu-find@2x.png | Bin 0 -> 930 bytes platform/icons/src/actions/menu-open.png | Bin 360 -> 353 bytes platform/icons/src/actions/minimize.png | Bin 222 -> 226 bytes platform/icons/src/actions/minimize@2x.png | Bin 0 -> 307 bytes .../icons/src/actions/minimize@2x_dark.png | Bin 0 -> 297 bytes platform/icons/src/actions/minimize_dark.png | Bin 212 -> 212 bytes platform/icons/src/actions/module@2x.png | Bin 0 -> 250 bytes .../icons/src/actions/move-to-button-top.png | Bin 190 -> 187 bytes .../src/actions/move-to-button-top@2x.png | Bin 0 -> 251 bytes .../src/actions/move-to-button-top@2x_dark.png | Bin 0 -> 235 bytes .../src/actions/move-to-button-top_dark.png | Bin 182 -> 187 bytes platform/icons/src/actions/move-to-button.png | Bin 182 -> 185 bytes .../icons/src/actions/move-to-button@2x.png | Bin 0 -> 247 bytes .../src/actions/move-to-button@2x_dark.png | Bin 0 -> 230 bytes platform/icons/src/actions/moveDown.png | Bin 346 -> 347 bytes platform/icons/src/actions/moveUp.png | Bin 325 -> 349 bytes platform/icons/src/actions/new@2x.png | Bin 0 -> 731 bytes platform/icons/src/actions/new@2x_dark.png | Bin 0 -> 563 bytes platform/icons/src/actions/newFolder.png | Bin 561 -> 560 bytes platform/icons/src/actions/newFolder@2x.png | Bin 0 -> 1199 bytes .../icons/src/actions/newFolder@2x_dark.png | Bin 0 -> 1095 bytes platform/icons/src/actions/newFolder_dark.png | Bin 0 -> 515 bytes platform/icons/src/actions/new_dark.png | Bin 0 -> 283 bytes platform/icons/src/actions/nextfile@2x.png | Bin 0 -> 820 bytes platform/icons/src/actions/pause@2x.png | Bin 0 -> 317 bytes platform/icons/src/actions/popFrame.png | Bin 412 -> 407 bytes platform/icons/src/actions/popFrame@2x.png | Bin 0 -> 799 bytes .../icons/src/actions/popFrame@2x_dark.png | Bin 0 -> 804 bytes platform/icons/src/actions/popFrame_dark.png | Bin 0 -> 407 bytes platform/icons/src/actions/prevfile.png | Bin 419 -> 421 bytes platform/icons/src/actions/prevfile@2x.png | Bin 0 -> 819 bytes platform/icons/src/actions/preview.png | Bin 579 -> 582 bytes platform/icons/src/actions/previewDetails.png | Bin 223 -> 349 bytes .../icons/src/actions/previewDetails@2x.png | Bin 0 -> 542 bytes .../icons/src/actions/previousOccurence.png | Bin 349 -> 325 bytes platform/icons/src/actions/properties.png | Bin 372 -> 358 bytes platform/icons/src/actions/properties@2x.png | Bin 0 -> 568 bytes .../icons/src/actions/properties@2x_dark.png | Bin 0 -> 555 bytes platform/icons/src/actions/quickList.png | Bin 561 -> 535 bytes platform/icons/src/actions/quickList@2x.png | Bin 0 -> 1167 bytes .../icons/src/actions/realIntentionBulb.png | Bin 465 -> 426 bytes .../icons/src/actions/realIntentionBulb@2x.png | Bin 0 -> 772 bytes .../src/actions/realIntentionBulb@2x_dark.png | Bin 0 -> 821 bytes .../src/actions/realIntentionBulb_dark.png | Bin 0 -> 418 bytes .../icons/src/actions/realIntentionOffBulb.png | Bin 470 -> 414 bytes .../src/actions/realIntentionOffBulb@2x.png | Bin 0 -> 751 bytes .../actions/realIntentionOffBulb@2x_dark.png | Bin 0 -> 800 bytes .../src/actions/realIntentionOffBulb_dark.png | Bin 0 -> 417 bytes platform/icons/src/actions/redo.png | Bin 549 -> 541 bytes platform/icons/src/actions/refactoringBulb.png | Bin 517 -> 465 bytes .../icons/src/actions/refactoringBulb@2x.png | Bin 1006 -> 924 bytes .../src/actions/refactoringBulb@2x_dark.png | Bin 0 -> 972 bytes .../icons/src/actions/refactoringBulb_dark.png | Bin 0 -> 467 bytes platform/icons/src/actions/rerun@2x.png | Bin 0 -> 810 bytes platform/icons/src/actions/reset@2x.png | Bin 0 -> 1062 bytes platform/icons/src/actions/restart.png | Bin 519 -> 511 bytes platform/icons/src/actions/restart@2x.png | Bin 0 -> 1128 bytes platform/icons/src/actions/resume.png | Bin 466 -> 461 bytes platform/icons/src/actions/resume@2x.png | Bin 0 -> 888 bytes platform/icons/src/actions/rollback.png | Bin 566 -> 566 bytes platform/icons/src/actions/runToCursor.png | Bin 135 -> 236 bytes platform/icons/src/actions/runToCursor@2x.png | Bin 0 -> 315 bytes .../icons/src/actions/runToCursor@2x_dark.png | Bin 0 -> 315 bytes .../icons/src/actions/runToCursor_dark.png | Bin 0 -> 240 bytes platform/icons/src/actions/search.png | Bin 437 -> 438 bytes platform/icons/src/actions/search@2x.png | Bin 0 -> 891 bytes platform/icons/src/actions/search@2x_dark.png | Bin 0 -> 894 bytes platform/icons/src/actions/search_dark.png | Bin 0 -> 441 bytes platform/icons/src/actions/selectall.png | Bin 376 -> 358 bytes platform/icons/src/actions/selectall@2x.png | Bin 0 -> 637 bytes .../icons/src/actions/selectall@2x_dark.png | Bin 0 -> 637 bytes platform/icons/src/actions/selectall_dark.png | Bin 0 -> 367 bytes platform/icons/src/actions/share.png | Bin 517 -> 547 bytes platform/icons/src/actions/share@2x.png | Bin 0 -> 1299 bytes platform/icons/src/actions/showAsTree@2x.png | Bin 0 -> 775 bytes .../icons/src/actions/showAsTree@2x_dark.png | Bin 0 -> 781 bytes platform/icons/src/actions/showAsTree_dark.png | Bin 0 -> 452 bytes platform/icons/src/actions/showChangesOnly.png | Bin 560 -> 499 bytes .../icons/src/actions/showChangesOnly@2x.png | Bin 0 -> 905 bytes .../src/actions/showChangesOnly@2x_dark.png | Bin 0 -> 954 bytes .../icons/src/actions/showChangesOnly_dark.png | Bin 0 -> 503 bytes platform/icons/src/actions/showHiddens@2x.png | Bin 0 -> 409 bytes .../icons/src/actions/showHiddens@2x_dark.png | Bin 0 -> 435 bytes .../icons/src/actions/showHiddens_dark.png | Bin 0 -> 313 bytes .../src/actions/showImportStatements@2x.png | Bin 0 -> 810 bytes .../icons/src/actions/showReadAccess@2x.png | Bin 0 -> 1401 bytes .../src/actions/showReadAccess@2x_dark.png | Bin 0 -> 1311 bytes .../icons/src/actions/showReadAccess_dark.png | Bin 0 -> 573 bytes platform/icons/src/actions/showWriteAccess.png | Bin 533 -> 526 bytes .../icons/src/actions/showWriteAccess@2x.png | Bin 0 -> 1379 bytes .../src/actions/showWriteAccess@2x_dark.png | Bin 0 -> 1373 bytes .../icons/src/actions/showWriteAccess_dark.png | Bin 0 -> 528 bytes .../icons/src/actions/splitHorizontally.png | Bin 216 -> 213 bytes .../icons/src/actions/splitHorizontally@2x.png | Bin 0 -> 280 bytes .../icons/src/actions/splitVertically@2x.png | Bin 0 -> 376 bytes .../icons/src/actions/startDebugger_dark.png | Bin 589 -> 590 bytes platform/icons/src/actions/stepOut.png | Bin 366 -> 363 bytes platform/icons/src/actions/stepOut@2x.png | Bin 0 -> 658 bytes platform/icons/src/actions/stepOut@2x_dark.png | Bin 0 -> 661 bytes platform/icons/src/actions/stepOut_dark.png | Bin 0 -> 361 bytes platform/icons/src/actions/submit1@2x.png | Bin 0 -> 377 bytes platform/icons/src/actions/submit1@2x_dark.png | Bin 0 -> 377 bytes platform/icons/src/actions/suspend@2x.png | Bin 0 -> 294 bytes platform/icons/src/actions/swapPanels.png | Bin 588 -> 589 bytes platform/icons/src/actions/swapPanels@2x.png | Bin 0 -> 1223 bytes .../icons/src/actions/swapPanels@2x_dark.png | Bin 0 -> 1223 bytes platform/icons/src/actions/swapPanels_dark.png | Bin 592 -> 593 bytes platform/icons/src/actions/syncPanels.png | Bin 575 -> 546 bytes platform/icons/src/actions/syncPanels@2x.png | Bin 0 -> 1164 bytes .../icons/src/actions/syncPanels@2x_dark.png | Bin 0 -> 1203 bytes platform/icons/src/actions/syncPanels_dark.png | Bin 562 -> 571 bytes .../icons/src/actions/toggleSoftWrap@2x.png | Bin 0 -> 1189 bytes .../src/actions/toggleSoftWrap@2x_dark.png | Bin 0 -> 1183 bytes platform/icons/src/actions/traceInto.png | Bin 368 -> 366 bytes platform/icons/src/actions/traceInto@2x.png | Bin 0 -> 641 bytes .../icons/src/actions/traceInto@2x_dark.png | Bin 0 -> 633 bytes platform/icons/src/actions/traceInto_dark.png | Bin 0 -> 366 bytes platform/icons/src/actions/traceOver.png | Bin 412 -> 416 bytes platform/icons/src/actions/traceOver@2x.png | Bin 0 -> 828 bytes .../icons/src/actions/traceOver@2x_dark.png | Bin 0 -> 820 bytes platform/icons/src/actions/traceOver_dark.png | Bin 0 -> 382 bytes platform/icons/src/actions/uninstall.png | Bin 386 -> 427 bytes platform/icons/src/actions/unselectall.png | Bin 224 -> 208 bytes platform/icons/src/actions/unselectall@2x.png | Bin 0 -> 246 bytes .../icons/src/actions/unselectall@2x_dark.png | Bin 0 -> 246 bytes .../icons/src/actions/unselectall_dark.png | Bin 0 -> 210 bytes platform/icons/src/actions/unshare.png | Bin 761 -> 684 bytes platform/icons/src/actions/unshare@2x.png | Bin 0 -> 1583 bytes 216 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 platform/icons/src/actions/GroupByModuleGroup@2x.png create mode 100644 platform/icons/src/actions/GroupByModuleGroup@2x_dark.png create mode 100644 platform/icons/src/actions/GroupByModuleGroup_dark.png create mode 100644 platform/icons/src/actions/GroupByPackage@2x.png create mode 100644 platform/icons/src/actions/GroupByPackage@2x_dark.png create mode 100644 platform/icons/src/actions/clean@2x.png create mode 100644 platform/icons/src/actions/clean@2x_dark.png create mode 100644 platform/icons/src/actions/cleanLight@2x.png create mode 100644 platform/icons/src/actions/cleanLight@2x_dark.png create mode 100644 platform/icons/src/actions/cleanLight_dark.png create mode 100644 platform/icons/src/actions/clean_dark.png create mode 100644 platform/icons/src/actions/commit@2x.png create mode 100644 platform/icons/src/actions/createPatch@2x.png create mode 100644 platform/icons/src/actions/cross@2x.png create mode 100644 platform/icons/src/actions/cross@2x_dark.png create mode 100644 platform/icons/src/actions/cross_dark.png create mode 100644 platform/icons/src/actions/diff@2x.png create mode 100644 platform/icons/src/actions/diff@2x_dark.png create mode 100644 platform/icons/src/actions/diffWithCurrent@2x.png create mode 100644 platform/icons/src/actions/diffWithCurrent@2x_dark.png create mode 100644 platform/icons/src/actions/diffWithCurrent_dark.png create mode 100644 platform/icons/src/actions/dump@2x.png create mode 100644 platform/icons/src/actions/dump@2x_dark.png create mode 100644 platform/icons/src/actions/dump_dark.png create mode 100644 platform/icons/src/actions/edit@2x.png create mode 100644 platform/icons/src/actions/edit@2x_dark.png create mode 100644 platform/icons/src/actions/editSource@2x.png create mode 100644 platform/icons/src/actions/editSource@2x_dark.png create mode 100644 platform/icons/src/actions/editSource_dark.png create mode 100644 platform/icons/src/actions/edit_dark.png create mode 100644 platform/icons/src/actions/erDiagram@2x.png create mode 100644 platform/icons/src/actions/erDiagram@2x_dark.png create mode 100644 platform/icons/src/actions/erDiagram_dark.png create mode 100644 platform/icons/src/actions/exclude@2x.png create mode 100644 platform/icons/src/actions/exit@2x.png create mode 100644 platform/icons/src/actions/exit@2x_dark.png create mode 100644 platform/icons/src/actions/exit_dark.png create mode 100644 platform/icons/src/actions/export@2x.png create mode 100644 platform/icons/src/actions/filter_small@2x.png create mode 100644 platform/icons/src/actions/filter_small@2x_dark.png create mode 100644 platform/icons/src/actions/filter_small_dark.png create mode 100644 platform/icons/src/actions/gc@2x.png create mode 100644 platform/icons/src/actions/gc@2x_dark.png create mode 100644 platform/icons/src/actions/gc_dark.png create mode 100644 platform/icons/src/actions/get@2x.png create mode 100644 platform/icons/src/actions/groupByMethod@2x.png create mode 100644 platform/icons/src/actions/groupByMethod@2x_dark.png create mode 100644 platform/icons/src/actions/groupByTestProduction@2x.png create mode 100644 platform/icons/src/actions/groupByTestProduction@2x_dark.png create mode 100644 platform/icons/src/actions/install@2x.png create mode 100644 platform/icons/src/actions/menu-cut_dak.png create mode 100644 platform/icons/src/actions/menu-find@2x.png create mode 100644 platform/icons/src/actions/minimize@2x.png create mode 100644 platform/icons/src/actions/minimize@2x_dark.png create mode 100644 platform/icons/src/actions/module@2x.png create mode 100644 platform/icons/src/actions/move-to-button-top@2x.png create mode 100644 platform/icons/src/actions/move-to-button-top@2x_dark.png create mode 100644 platform/icons/src/actions/move-to-button@2x.png create mode 100644 platform/icons/src/actions/move-to-button@2x_dark.png create mode 100644 platform/icons/src/actions/new@2x.png create mode 100644 platform/icons/src/actions/new@2x_dark.png create mode 100644 platform/icons/src/actions/newFolder@2x.png create mode 100644 platform/icons/src/actions/newFolder@2x_dark.png create mode 100644 platform/icons/src/actions/newFolder_dark.png create mode 100644 platform/icons/src/actions/new_dark.png create mode 100644 platform/icons/src/actions/nextfile@2x.png create mode 100644 platform/icons/src/actions/pause@2x.png create mode 100644 platform/icons/src/actions/popFrame@2x.png create mode 100644 platform/icons/src/actions/popFrame@2x_dark.png create mode 100644 platform/icons/src/actions/popFrame_dark.png create mode 100644 platform/icons/src/actions/prevfile@2x.png create mode 100644 platform/icons/src/actions/previewDetails@2x.png create mode 100644 platform/icons/src/actions/properties@2x.png create mode 100644 platform/icons/src/actions/properties@2x_dark.png create mode 100644 platform/icons/src/actions/quickList@2x.png create mode 100644 platform/icons/src/actions/realIntentionBulb@2x.png create mode 100644 platform/icons/src/actions/realIntentionBulb@2x_dark.png create mode 100644 platform/icons/src/actions/realIntentionBulb_dark.png create mode 100644 platform/icons/src/actions/realIntentionOffBulb@2x.png create mode 100644 platform/icons/src/actions/realIntentionOffBulb@2x_dark.png create mode 100644 platform/icons/src/actions/realIntentionOffBulb_dark.png create mode 100644 platform/icons/src/actions/refactoringBulb@2x_dark.png create mode 100644 platform/icons/src/actions/refactoringBulb_dark.png create mode 100644 platform/icons/src/actions/rerun@2x.png create mode 100644 platform/icons/src/actions/reset@2x.png create mode 100644 platform/icons/src/actions/restart@2x.png create mode 100644 platform/icons/src/actions/resume@2x.png create mode 100644 platform/icons/src/actions/runToCursor@2x.png create mode 100644 platform/icons/src/actions/runToCursor@2x_dark.png create mode 100644 platform/icons/src/actions/runToCursor_dark.png create mode 100644 platform/icons/src/actions/search@2x.png create mode 100644 platform/icons/src/actions/search@2x_dark.png create mode 100644 platform/icons/src/actions/search_dark.png create mode 100644 platform/icons/src/actions/selectall@2x.png create mode 100644 platform/icons/src/actions/selectall@2x_dark.png create mode 100644 platform/icons/src/actions/selectall_dark.png create mode 100644 platform/icons/src/actions/share@2x.png create mode 100644 platform/icons/src/actions/showAsTree@2x.png create mode 100644 platform/icons/src/actions/showAsTree@2x_dark.png create mode 100644 platform/icons/src/actions/showAsTree_dark.png create mode 100644 platform/icons/src/actions/showChangesOnly@2x.png create mode 100644 platform/icons/src/actions/showChangesOnly@2x_dark.png create mode 100644 platform/icons/src/actions/showChangesOnly_dark.png create mode 100644 platform/icons/src/actions/showHiddens@2x.png create mode 100644 platform/icons/src/actions/showHiddens@2x_dark.png create mode 100644 platform/icons/src/actions/showHiddens_dark.png create mode 100644 platform/icons/src/actions/showImportStatements@2x.png create mode 100644 platform/icons/src/actions/showReadAccess@2x.png create mode 100644 platform/icons/src/actions/showReadAccess@2x_dark.png create mode 100644 platform/icons/src/actions/showReadAccess_dark.png create mode 100644 platform/icons/src/actions/showWriteAccess@2x.png create mode 100644 platform/icons/src/actions/showWriteAccess@2x_dark.png create mode 100644 platform/icons/src/actions/showWriteAccess_dark.png create mode 100644 platform/icons/src/actions/splitHorizontally@2x.png create mode 100644 platform/icons/src/actions/splitVertically@2x.png create mode 100644 platform/icons/src/actions/stepOut@2x.png create mode 100644 platform/icons/src/actions/stepOut@2x_dark.png create mode 100644 platform/icons/src/actions/stepOut_dark.png create mode 100644 platform/icons/src/actions/submit1@2x.png create mode 100644 platform/icons/src/actions/submit1@2x_dark.png create mode 100644 platform/icons/src/actions/suspend@2x.png create mode 100644 platform/icons/src/actions/swapPanels@2x.png create mode 100644 platform/icons/src/actions/swapPanels@2x_dark.png create mode 100644 platform/icons/src/actions/syncPanels@2x.png create mode 100644 platform/icons/src/actions/syncPanels@2x_dark.png create mode 100644 platform/icons/src/actions/toggleSoftWrap@2x.png create mode 100644 platform/icons/src/actions/toggleSoftWrap@2x_dark.png create mode 100644 platform/icons/src/actions/traceInto@2x.png create mode 100644 platform/icons/src/actions/traceInto@2x_dark.png create mode 100644 platform/icons/src/actions/traceInto_dark.png create mode 100644 platform/icons/src/actions/traceOver@2x.png create mode 100644 platform/icons/src/actions/traceOver@2x_dark.png create mode 100644 platform/icons/src/actions/traceOver_dark.png create mode 100644 platform/icons/src/actions/unselectall@2x.png create mode 100644 platform/icons/src/actions/unselectall@2x_dark.png create mode 100644 platform/icons/src/actions/unselectall_dark.png create mode 100644 platform/icons/src/actions/unshare@2x.png diff --git a/platform/icons/src/actions/GroupByModule.png b/platform/icons/src/actions/GroupByModule.png index 86a6b55ec88c93eaad36aa4a97206761faedec0d..ec4d538e75c74e84939b70328710f51f751041bd 100644 GIT binary patch delta 235 zcmV+e`@uPf$cUk4Ff*m`05f8!c?!`< zayH*-PZvcgwYr25ki70>sx1J!{Q=S}vjW~t1MN&(09YKuCS*&kfDa}BAE3h__7zq@ z7Yd-l4TyYz9=}c<3G`m#O@Kqh^$Q_@UMh%$v?q|te+I`VC$8JGwP?ec+|11it=f1- lK=lV?FjwPiTvI;*1^^mvP~zyRe8K<#002ovPDHLkV1nnmV`~5a delta 235 zcmVkohK%7ejPi6!0 z6(DW_VsAoGAPU5bf%qE`hXe6XDmVaU)-R~pGWZ5<6^K^=@edj};42WXg4%x>hLH<^z!pj$ zK-RVDCIdwUMVLARBNBHH5N83g4K@epLg_2W25@k4GB7hUlV$nezkh+`cVwZ_)Cot z_yhFCpa0~Az#nRaz<{TLfB(o&1ONUFhY$ey{tvmifW#2^0>nH(%!OPU{sm_zGIIf@ z5Ufc3j?Dqjq4hMVU2q3EEB&QjHiXqTPqDQJuAtS5@Zyvbj0S&np!8L2A#e1y&EQY!!e002ovPDHLkV1hAY B=x+c3 delta 569 zcmV-90>=G~1(OAkNdYyHN+5rqK7Bfk5(`XCO+f}H0C6P{cfiCG6BBWUfE!fd86eK3 zf+w?q_zDoW0I@frC=dnW#X$TGh{J*SClwq3GwT=BY#DqGXa{03Ag%-AdsK|-Ye3uz z#DYNFi^~C0KpY3eFMxOk4bs~LAbtbHAwaB(%>h9`%nHOSfcOUu9Pob?h*v@F48zC; zKwt}{4q_wQdI`5js4 zGL+WD<^V}3{Tx|`ppXy)Cl?o44*32JlmVV13q6C<64)FdfRt_EfQ^HLfs>m&2mJl_ z4_lT50d{N-zzY5W>xzHBWY!n|h|ovS0e}Ae2V-&oG5QEP;P3x`*n*O{DER-63J#zk z1pZPZ1pWYh@#jBzA@GM9Au!-+;NL&;)4;!f!yyDfzW+mRE+8=kz5p=~5OX1yhJV4? ziOgJpDFiE0zhiU2b7(ycY8Tu=&Pso&mknX{%~Ndcfh%aWBD{Y%r39k^9VmSjTL>Hj z;y@sF0pj&ALG_2*87XRph?yeu?4a}!Y$31)8f~D~3O5Z}L~KAD3AJMlHU~Ta;^jar z0>lM0a6l$B4J?D&g|$^&0Bw}k0I@a|Ems8MW*~kG#O3&!{Kc^Uk2?kdyC00000NkvXX Hu0mjf?-uSR diff --git a/platform/icons/src/actions/GroupByModuleGroup.png b/platform/icons/src/actions/GroupByModuleGroup.png index 5a20447f872686fa109c820c4207956856d0ae1d..5f85a0158478b4a646781ed3b9a232da4cf8fdd5 100644 GIT binary patch delta 360 zcmV-u0hj*S0jC3yNPhuINklyK2Kg5S-PmB%BAhO5r+9ejuL_lGZ<9@Q1lJ zfpjL78|M@3R4H79KroJF>2#0m8O0bWL=Ik9IOcZdX7BdMdyi9sf zvy{A-d>M^Kh$`?{GOC(!#Q|5~vE)OM;H1a(o%icIuT%u*Jby}Khwzv)tBFzsYaOm$ zAL+2ZA<*rf3ok;K7agQ&jBHyptVDG{u|gunoG^&wu!z7h@362}kA{Qw zMh~nfl%+wIms4qFr8plH#v#izx@`iVtM%e*n@hhIMXpx?)7C7Q8Ko}U1qyARt;|*s z5Enxkles6F7-0d8xC*oLr$CfQ|7ijkBd_29QP^Q|3`f*{iB=A9N=b2qofFBh4wwbC zU*gT%Q?u&h7iP`DLp52)#{B6GF~ref9P^M3Y!m^=%a7B}N^0WN?XON>C9YoY8~io<~Ffrtw* z;^H%5@hcpILK}#i(BmGNPc<(vVv|Hl2eml;Mrn2i2rvMcRuU@odQrRD00000NkvXX Hu0mjfI}AXH diff --git a/platform/icons/src/actions/GroupByModuleGroup@2x.png b/platform/icons/src/actions/GroupByModuleGroup@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4ec30899cb1a4b8f016eb6e74e0c5a1c7b60b85 GIT binary patch literal 763 zcmVJNRCwCtmrZEYP!Pvon&x8{tGE`6 zf`|yBSnwni^rDx7pm-DZA|3=qEP{CO^J3M52a$q^;B|{PMJRevK@Wm>5yUE}NI@*v z`iZ;SZW8~mJHauTbdzqD3J&~u%XISce|aF}1&3+Q5zsfE zfHPnfxD4LrxYe&|VavhUBmsT2SCimo2lDL(mR@|X??v7Of zY=Fk6{Hgb=2NN5`x{vpbv@v9l!2z&U60niRaXvx8wUueci^cQ&Ofh7yXxtzP2(xpN zKT#?zQN@B2oBUT51@bO^Ol0m}Nx)JXYy1hvw#3Qx>Vgb0k-2*$0ird0e-6oSW{7Fo zij&Oq0@d&W(QjsmS+D@Tidj!yo&9%=?sPxNr62glV-_r+_WX>R_*B2@ydk*vz zmE*>1yk0|-`SK^mc93p?qPlPXn5pAP`P!xc)3Q{z6VK%as|+1uL1grP>7}@DasfZ6 zL%F;gdOm907iygOl41mx%ia|e@RBQw<;29XCOXaE-5EMI0&q7c{5yZl;G)7ZcNC=1s!gaw;5rST!g%*O?2x1geBp?R- zzz@8SWOw{e?k&FCoxNMRJ%Tv!V|M4>%>HNQy*G1)lu|5b=@H9Zdc%iOsl?llfH5## zE|*Vr@&V8DuA({s#=*6)y;v+JuE0)k4m<~EGnk|rV-}nNyW4HSDliEaz%fwEKtKf? zr7@?#Kq~>~!8&jSyvcB@U(v)?g9}Ll257J5!ObrC+YRsq><1fk0``zo-Ujt92vA#b zhrYQt76mB7R6pUp-mM=^Oca|w+&9|U2q6vj@(3IPLplLlsh;KCbFM8+Gaf9yAEdNt z^5d6OZ_x<|y>p)TC=^zRe9nmt{;Pt4-=?r>77&izuM@D6>MHNy*p_y1H9MKYCQ`z& z`*Z@dWiber(6yT>Y*MG9)Hx^HUu6S{ zu4vH6e^T}bnfO3oUN~+%#%on1n6H0qYzHnW1?7guL%miff9ybjX<4GzvEwVlB173& z5E;E+`b+P%)B=7`hH`l}^aI3rpowwTmSm%8a@n_H0zQ!dbtb&$Gc|R2fVHKup|Y0h zkGe2?P4!@O8I$-Mo1_z$ufS68Ka$_w6qy)N<<^kI|pBZyX3O!%9QIu z&QYGcPwfnt(FvHN>sSFC?t*}WxkW$h{7Qxv2&8%e*m^0@gab+!tb(e_+tN8O{LaxdcZNo4a7AW(|dD*$&GB38<>J=~~Ku<5qQV%x~%?8{QZsK=a6q`SVN`=&vXxM=@ z2wX5YnMjBnp*@3uGvLgUL+lrLemiGl??Thkdw;U_#oBXPfz=3+hP>Ji`q1nABftP) W@@{x+L1wT300004m delta 325 zcmV-L0lNN#1BC;SNq;9vL_t(|+N6^~PQx$|MaQvYOo|ZOMl9HH1r}U^1t5000M`h| z-~!pOso)Msb((mzlB6oO7^`F%QVH%zs~y&&bn% zGz;<@^0%TWAPT{;VhB02paBtrW5r#FuOt=S==IsR<2-8jHGj2-7W0>{=|dlB18{sY z0d*+bJz@=2Y4W@CpBxcaP>MZ&PT5v~lme7m1N?wxEWjoQ(3}S^HYH_N&Y4udQByB>=5n)7lIV5$zKEDO{x=uBw(BiAu#Zlw`O9 zXA!tya5RyScs@bLBF=y_M-^f};OYI8?fMp)k=}-zHP#kE(*ou@KpOG9eU1CruK)u8 XvBPn4_~2Aw00000NkvXXu0mjf+|-xa diff --git a/platform/icons/src/actions/GroupByPackage@2x.png b/platform/icons/src/actions/GroupByPackage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9a6c060042c9016c8bb8b903c36722844751473b GIT binary patch literal 809 zcmV+^1J?YBP)RIXzh@8?)uYbOZsf zc;4tIz{}1Bw;YDEBAvEFt;wbol}c6oT&zq@6v|Ul20QKX=TXD6jj_g0K#u3C>j66@ zG8re_18C!^lqF2V5K9o!grFdyx^0ZCpMWmoO39u+wH-_3%#6sabVQH`YE`t8_dQy% zuK*b>56KHen5~{?L3e^lyiwZ&*X9f(PR$)1YwxP0>`#EV@K0=4#47qmz0sUrqS)}NCGU=bk}(6wJKQ4^A|q>Z@>nynFI)WTXr4n3CE#~w&G@@7f;_4 zw^P6iu#+#PPwvi-7$W(xUB7d5HlkVb7GIf$2CzBBZx=O5I-UIleB|rcYOsF*0`_u# z-Pi5~U9I>6_)ceuerri!tOv(A`DVh-0#bIEPo7%|g~HZs9RWXj9Y%BDGH2|i1O$+c nE#M+}*7;B4zyEdoTYv!o8;UP8B2xSkym11kQu|;KV=f zaSiMTGvJo{VWCj)^}sH02D}2NV|Yon@fMr{qrF0~2HXHOa0FCi5U>OeE1Ne#Hb}r( zumM~JA7c#lJN072;GCa;tcukxmvH>SpOC1bXf zn+hTJjhZ)m32?J>zF7{#X-X#TKx?8Qs9dhl;zD_HPp&j6gum13M22e{W1W|PjG8M= z57-GxrJP_7pp7RI7MX@YOAyk4AU~mtnr)1jTNGJ<5O|}u2d>WYXjWb9{s!aoF!Chl|85q5n* z8Mc#@!+>R*}wr1-X_|@w$ngdr<#$Jv= p0NdCGE`jHr|1|#lU&nt07yum=Fi|P{JwE^d002ovPDHLkV1m6%W%2+3 literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/GroupByPackage_dark.png b/platform/icons/src/actions/GroupByPackage_dark.png index 1d6a741854d276148b0116abf8e9bc18e7ab0e64..367161333a1179195d98a189299801429f520bbd 100644 GIT binary patch delta 338 zcmV-Y0j>Uz1Cj%fNq;m+L_t(|+N6_BPQx$|g~xH?niL_nWW|Onu;2jMumHpbvf~=z z7~SOvmDuF~NaYepEGi+fVU?fSF*DRLZb>0kpE8o;%=Y6aw(tsRpat)>Z{8pebA@ zucoe78;Mdz*h`f7?+T34z(WSdQvopRWnezpSxZT8{%P k_JH)}h5H*1(U$-N092xM)W}aK;{X5v07*qoM6N<$f;TIdcmMzZ delta 335 zcmV-V0kHm(1CIlcNq;d(L_t(|+N6_BPQx$|g~y5GniL^eHe$;aSg^c#3s`@Yw`*MHO>RG7Z5W^=bLj^q6v zv~hMm1$iR6cf=ZsyhDj+lhCp@2l&onv2VZi6*BO7}b+Lqqioporet)>GkM?hNf hay#f_kMoZJ0|0UsZ)QqbECT=l002ovPDHLkV1h~&mBs)7 diff --git a/platform/icons/src/actions/GroupByPrefix@2x.png b/platform/icons/src/actions/GroupByPrefix@2x.png index d602305eea682bbe79565e4cf2b79a5f0adf4d68..8b2a4bb799c33fe94decfa3b946b72c8296f00b2 100644 GIT binary patch delta 627 zcmV-(0*w901;+)DNdak*N*aG55SIe+Tp+Hc(2nUq><`5CKs*~JIBnWAoFU*0#3ev{ z8i<>y;7O22?gDWg5Ze%n0&yUo48)&6fda(8so;PwK%57}|Dk3J;B!DNR6z$2Kc!++ zpNB>T$b${I93TsgE0D#@Xpr8fLPItPh-I)jzz2w#fp{a8f*u`!EZ=_yP59mzxc~^v zp!5+CVZwBeqypm1KP5&YlpO-%2&i2%(H)=;rLThsHg;wPW@cuhEdTrWF9XAOqLf~T z(i+%8KmwXl--0-Nd@Kx{TpUE1`u*DvWCt9E(zaOmuc2%)Y!2Xn#?v3L1oKY@c2-8B z9Pk^c77f_o;QxWr+}M8{fC9EWQ(`1DvDxC`{~74I;2X}m03*4IKP4#_*u9h{E5vX* z;4j-h21X)t!GBOLptLqb2fz3j8JM|Ph|7lG{vmVm7CddK57?~NESlEbiz%NFk zbAdWqt%%})lR)eMD%5~@zx=(ew8#b4NOobQ%FWQ~H~@&*X^;arpe>=_(3TN~1MYz; zL1@Dm18 z6KWPH3bLUd#9I>X2I3wd)&b&1DmVbt$Iu4iW>|w488D9c-Z4Oc0RYp^js{N94oLt2 N002ovPDHLkV1j;i5}p76 delta 628 zcmV-)0*n2}1;_=ENdan+N*aGH5H|twBp}YG(2nIm90A0IKs*5^IBnWAoFU)^#En3F z6o^Zy;K?)~z6r!VKES^Jy^wtT)AAvX;h~=?4AOwh+fp`TF|E7O|13;Fqg(m!9 zj9dT&Hc)yWh%jNgM^XWC=ARNH5z6)eaT3(7K6D3YL+Q&Pf{mS-fti_^D9iu;{ma1c zohYT3ptKIQ5RitZ)K?%5A0G3Ma6(%`zo9K7 z3frfw~5cgBT0n>rl0NTsihc3xD;(Nyc0R{lHyN(7@lCll} O0000)6f}n`tQ9%(w z!Al~ZA}ESIR;z*t>Pd`>NOBU?O9k=bK~OKI6^|mQ2SG8Z3KmK1c9Zp+%6l2!5S|Cdw>QWhP3o8I$KU-|6u`1vzK}oGt9yYCh{;x3 z%=b26GRn-B8z~>2a&D^VQ_B$8UeRF}^u6`U36n_OfXjuGxTsyitDJ$+^rM^eZLV! zlvm*XTM85f>xfjMU~xAA@;FO!o2lt~uv`$#>8HH}OmUuG4!#T|lN5``m3p0NAQ603 zih>pPL4WHd;2jItBn22kqexU&5?~1BD43IR-2z^Mo$W)7=;?uFHSB3kZDC`Gf)Aa? zTrTGs1(ixg7TX+SwN2O`Cb*WTQ9P&4s9V`5!Zev}C)v-kxRzJlVIk-6h%b&u79a$V zf~DYr(+9k6#oxgxkPdP1_22|M`o(SsLyfDwL_t(|+T@o#XcR#d$7go-_OhpUg$RdAPy}P4f`aK178DU| z70(X{Xkir;3k%U8NvDP=Ha3E&g&t~`!a@RPu(4AcwGo7-DY?1 zo$PXj1HYZGW#+##@6DT)^?F@&GZ~`G$!rwz`FwNx2p9wRz<(v(P$(2a2XY)IsOu>> z1ulcTjmBIq7q|k)z$kbNu0-&W7r!8l0!OCcFanQ2tRrtfUf3Db}Y|t5xnQe4u=<-wJFaOZ}xQ znT#pyR1a&^QgKC;{#K_cAM~luQhAG?0Gsxy@~1S{?xf)d9IvQ+-zC*Tta*rx@!QVGMf zSOQ$h_J4wwi0c)gl^z90z^kF&CG6?aT4%dkvFLR;UU0~>DlJy|oWk*G&=Z3P*mM&r z)6Hm|fG^+$#p>Z01Y880!J}pyFnnH`12;flgp= diff --git a/platform/icons/src/actions/back.png b/platform/icons/src/actions/back.png index db458a9fc89f197a3a1b95db544eef8eeaf30244..f33a6ad2cede6678cdda9ab835a85558da8a5dd6 100644 GIT binary patch delta 443 zcmV;s0Yv_Q1o{JzNq?M4L_t(|+N4uUD@9QhUTd#?&T-BSWnd^n6RA7#=!VNd$&iwC zhi*oc;x|b0N(M%hQYccSu4i8V00RSN3{0eZ&$;{TZJ&YbmB;PwT9duk`o6Dk?GKew zP{?6W;Nd?#w9TCnCpM1=$(_M^%nP7(_RO?Qw&WC1FJhhwT7PCv9X-4jv8mIs34~Dp z_n>*|q}1TBYZtLj%f!c!J&^KO0DRj*J34>dnz(jqQ|yktyO>b}$1c&eI6t1~cHngo=RAU^=$$FJ;8??()SHZ_AANcCiy zRHluD?PL@FYmKSl))y}$x)5;7V`Rq&(Jr0CeNf$#vNQ(K$xOAXyc0HAJ?D5!fpj9mMbN?HlS>>Y zFC?W;4w5bK)Dkb%Zv(a>ov zLy(Rw`nLxoH-CYDJ<(W%uy^^)NBIFFr6fU->`E!?Y}?yt9^bQ0$E@qNskE;|^TCV~ zT}R@1vY0`9E>p=lO$i|zpP$8@Viyk?c+RyvXHZ}QL065I8h&L^ut?VQepu6RQ&q4$ z=|AWks}xAGJ=6jvJ>y<7_GIToHxSt3j8+9%t|Lp|gF3(tMl3s*b9)qzm7qHzyx$1~ rb~qXr*{n#Y3Q)_EWrVVWK+R5s#06Feh^HRK?7Xa?2&T*{|u`3`?)&9@r2Eh~e# z7J@HF!_3Q6-nMNcc5qT08De!Wm+~?OCY;$;gMS(XLCiQ{M(prgJaP)JyW7%42$x9` zp;A0?bXM%=(tlxT+qJsucG@0AQRK!mU_<9UVDOk&ObEv@MaN;V`PXKE6`+><^&vg1 zEF_>`Gob6xvyTf`7?MN@WYT8MdL4poWM;2#O9KY?@%e-w#4u|q27xhod?9;&*;#{3 zeA1*Da7 delta 426 zcmV;b0agC|1L*^hNq>t;L_t(|+PsrnO2a@DhI468Ch2t#?Sn2rUq$fEqBN~wqhN(@ zK+shv_~M(21)&K_@kO_wsB{Oq2dP!#q{(DRu@50l_u`!e5Q4I5eMH}B~zB=YTyU;S?7xX*a7HT(|^ciYkDT_bk>*5-@~M# zXA?tg^CyhK}h#h+J_d|T#X;hMowfg)WUZ1+$?e%J; zvotrImwl>2MAp!^? zSqX=W`zP&*u7A<(J_kYHlT=j=i+a?=MBl+}d7&(P-w}Nuu=r;IYBqZ2*npem`7#*H z0meWQf_rbSMMXVn=-J4au>semxiZsrM>h;mRV5rQ9-OwRs3(m)WNc*3NC0S1)eJTm z#;ck-JR2Pt^`wzU46-Yc07X{nvXEMy%dP3-cI324BO?zP2ic9W*Z8l0WB>pF07*qoM6N<$g5zw+m;e9( diff --git a/platform/icons/src/actions/checkOut@2x.png b/platform/icons/src/actions/checkOut@2x.png index 1f6cc9bbfce928bf4a8e41498a1508ed41798df4..f195cabbff596edf7c997720d7ceee8a2896efe4 100644 GIT binary patch delta 924 zcmV;N17rN`2-XLXNPh!(NklFqEToyaU6$@rKxO;O)I=fBogoOl79ou0e;`WM=;B`J_#HF ztH4Ac%lR5C1Mg^qonRAa0)yaSDwR6@PXe&}U@e#i-g?#-gK;433qA+j0S34X`az8R zE%G@Iwu4jP30MSv1Xcic4YYvuly$*c=+&RVRlvbK@W!)#!t=frTmk#&^Mz6x=ms`e z;q#H@{7Snm*neg^j$OXselzG;$`YY0&2zBOvlaz&!2{oY>%b7`3DH;|*g(fnRu|j` zQ#?YH)u^ZA@me#9EX>-#3vdQJ1C8=V=~c`U#(g8kzhXFprU>ha(j0Vvo&_He5Mj{=c zYCWOu+5*mnB_M;o1T#b0tcRxFF&ecyK!#M$$>%ZHN&@^0&Vt?EFHy$&X{Z&uu=G%O zRbSk9V1HwE36!v~k|{N*fCxAmHKH<2i!fCUjv<7@Y@0K|MfC{;X(NIJ8e{b=Y6Rbw zGi^3JG{U&eYfu5<1XeeqX)LPi!S`_2C-~lq6A*!GoCq?xE{Ok90gkmi+$oZPd%Y$V zP!#nN=R7fr3OF)>`TH+=v=d49ACAW>6ro7gH-FYa)%NcsBIp1qPF_Ui@|yJVid56I z^u3POc;yw)R7o-xYr?MFN+`1ZK(PwQYkGshqIIrFRW*{nwRd%VR7b!qn{g;!MD1kM z(Bc(!G0D#z(CI%gnioMlgemq;41(P9jm(za2$Q-)s*LUb+ix z!GCg4yWp9;ss(qDgf1s!qI7U2oi(%Z8jND$mfI5fvF!GDA&KBh$em}iX57qVt8YU_ zLUX9SOyIZ#CLx2H*=#d5*J6e&qZTU=;u$L7W^@Dyr-N0000SVi6u@U@XJ&oA#Xk^~lwYEr5aNd{C@c{4 zLj_rpLAxs?JTajH{SX8XgW^RIDAfBB6hTzF^yu{=C@>=9Ax6)j`e1#iFbL7o(lp=B z?A$y3&d#ijR_R^$U}elW$z*0OKo^ zZ9(Zx2>+HbvO#OT9KlA;_-*hXW?BY5V1Eu=fwlo03JpdH}X!QZoY7x-^u1Yr6Y zhKHCw0!(%2DSyq%I{^J7kb=Grhkwm%?a$1&0w1#fY`T88C9zDuLKI18egy8w+`R`{3w)hB{lgf)fXqyf9Ge9m#o-2o2 zUxmQxH0+yMkI41p_+`3)6!+xe}mz zIY5N|K*u`Aadxv@$^28CsC9J!fmyk47(1TcBi91`&z$Zvz^Z=gJc=TX{A=jFh2<~k zex+9WP`z4B2!1G|g4F@OwLGB%$jLc-75m}AdDTY-1%QC={_Vnn@k&bhjXH5oPX(fVX1a|j_-YOdQq?3?DLNe_8JZ_ zdVN6H3wn<8LmMLFlpM=-OP1r9ZD<`+_sY^rFWv#u)s%2xv@&9OWwTf-h^&hjE?Fv4 zLx_NmjnOT+uI2f@Sw+5YQ-5KUd@<_Rur;RTrECVbDr48e?Up>wkW^Omot;zW#P>r}5eD-o}foAktQgY}abO zoz+^!IN?i&tQ8x#8_l3u9YQPCNw`DZZp%r1cbqUsLQdXn2GwA`x%e`)(nO2X@(O@B z0izRQJZLuC#>4qw7;nLq&mlEScc?+yuH^X$h%PfWB tnE=<3z6nk!#?zClma+!<<^NZJ0RVLDQT|SLqb>jd002ovPDHLkV1g4t7IXjr diff --git a/platform/icons/src/actions/checkOut_dark.png b/platform/icons/src/actions/checkOut_dark.png index 81f15cdeea9e50fb2b2142cc31e2719e9f8acf0f..1cbfafa0756e6f7210b801fbdeab9e2e170a3067 100644 GIT binary patch delta 418 zcmV;T0bTyy1K|UZNq>V$L_t(|+N6^|OT$1I#_ukF+A0oCieJE85u~6}y9rXQASB=y za2CZuia7X(t`5#hB1(%@x`?8pt%AGw3EUK+ptNZcpEFlDL(>jE@FREc-Mx9=Cl~7b zKKYL*Pf#ot%NQSmV~_?pFbM{L4dS2t=YL>EB$x+f5x2k&xRhQx z0>)YsCZ4BYRE(3N8m__6VXk*@1p4I!AD{t-fCk<~TyN7huk;aI$qBd~Kps@2*r)JB zmIwBM%O|R|!27=q9axgusex%w74zqCf{G|#)~jroH*iPx)GoLXU)a?1>dToxj z+owidkVJ2sXn(O_*{L@pFH&Rz!WdzySa!V5H?gJh+=+#Vp~rO6)0ZHc9$4Zu9P(BB zCXG72v`_7)%|$cPgQ>lerKpObXbOs8!UK=Ej!WF8Yu~MA%&sP;@)s6i)Sxu*?RSso z+czt-X2%v}O>CEtgc#!L*!Sxhv#SSTCASLvXCl>&1sgMJ&yN5D072k;aG#{>J^%m! M07*qoM6N<$g1Pp{YybcN delta 415 zcmV;Q0bu^&1KtCWNq>MzL_t(|+N6`qO2a@DhG!<1wu%c^iZ9?^5u~6}yAz~ZK}f(C za4m`pDdNHl-MVnCB%)ZX(v2u8+A6pgpTM0W6qGhi;y-3AV`$oiKYW>FE+^;wIibGq zlmAHNmqMXX!mtkxK^o-1IOqd5h=UqPfjuw?p0nBPqACKNfqy9xU>20byal$vh4j)P zF!KAr#CQyb#eGs_!_^-;%=HEiK(8F&9n`@9(7>yh*ISg$GkpM;asaM-kOyUH?n8JY z%LBW>ZJH>=>%R#dSdhx8f=N&j&rjh1Ws$zD7uhh$qo!z7AEdWWea2{zv*(kml^Gh@ z2d$LojuR~wEPp$-M*Bu;DaHs>#j@i?Zu?WhXzs|ujG@PL($$k7njTo<)E)9!{UY@m zzO+y6$MtzL(u0YeqNS*cp=b({V8R2BxQqHu#y`m{AVJSwK+3t<A=0|4;=cy^GcwE+MC002ov JPDHLkV1h@z$u|H1 diff --git a/platform/icons/src/actions/clean.png b/platform/icons/src/actions/clean.png index 54696daae2fc077563afcd72ebc201b38d1eb40e..6444138e5fcd2ccc57d6886f23ca6846cc329986 100644 GIT binary patch delta 395 zcmV;60d)S`1Ih!CNq=lfL_t(|+G70w|33pIfQf-Zz=A_u9*A{;SQN^C4aAp#_z^J% zm@ZqkEaL3hv)-RSe^vkq@bdCLFflRN5*Zn}639J`te6ok4CGo{TPHqv@W70non4BV znHenj_wQeZpFe*-Q&3PiRb5?O02F$NH4GLkSdjekd8RG5+JXD07wlGzX1Aw?xabRYVaBWHN+nnVEI62n?cjTsb9Z- pO#o`%gszrxz%vuY1^@&Y0A-=6cfd23xc~qF07*qoLDwL_t(|+G70w|33pIfRR=P$OEx15Q{?juYvdy5I-Wu0MnT> zXGR=7der;FhYt!M0RaJl2R1e~Thh|fRsy-F@fjdjT3R~s)~#D+tgNh3%*@PS!M}h1 zGW`Di`BEXJ-@_7k^hHH#au}2!q%lF_7G( zNt2S1^`IDV;lhQmfB*goZP~J=c+sLon^{;`8bKJu28n^>E?&GCimZnPne*k#7X@~9 zc7|)$uKCv2*FT>%YgRf)9LS#e`0-<3Ha0e}8k`0I{rn$jBLfJ(c=6&nP{70;GNm3Q4vdw?tgI|%pynE&+B!1964HG>*(>esJd6M&jG(Je2~&j5e`0~G)iL&GE;$B)zi0000qLVUR_b(+dOJAPouG-L6xSaug_TUQHe04=F0zmEJ7$Lg=Eafn#837?JpsEok!x z9AOq~?yu(^=Nrcnv!g}?`{3bxyytzN_c`zPzUOS>Xf!JNmrI-y@V^O=0GBvi1kM0q z;0Le^eC81O8v-cl4Iujnzi+@i;65z@V&FPZ>i7Gl)6>&s%gf7UKA*2J5D4T*B$9A? zdiqzTQu(E%q-3eSzJ4hqBO?U=cfcDUdQt)9lzeh>@|wfps0)X~DzR8BLShkJX%R;x z5{X^Y($c(It#-y>FudnP%%4O+VK5l1>FMdwudlDyN~Kat5KB&1wwM3{1d2kTkf^x0 z_?5|Inw809ui^43SyLsuchhFG)opBS)XL@ZJ&?TsMA(bil@GFUK6?~{*n7m0EKf24 zg;P^gxAEjP3WdU7RaMnGJUnbf6)db0bWPY>$fvrxx)m`$5qk$572vuoSit`Ne$m|A zTmumo6cj8pHa5y&*7WuDnUT=Kj)ENr+2|hmkS}5uDHa?Lh)b{lyWOtGc`Av->-AQQ zj*jYxoPeG%qX8}PM#7$K>^^+;h`B|v;5bKIf(5wU?sD$QVpv;S(~pmj$3<7Cz?CET2oM-dOwOBo7N_ArHZiX! z4vApZ6C?lxJB)~*9IFfS-N{QH18md>7QO%;b_5H+8NU6ExeMJMPd+j-q9gF9gNfiT zRA*kW00hlYgEC}gWj*We?v5uP8ykzAIf3@f4j*%7W~PlFOI*jPfF1BqH|OW)yV~2^ z>Elw#Ms0OvIm#6-t6vrXQQ8Yk69iV{#6(@iiZ4sD3+3hI%LF#`&NWTd~@RObTzSpij5RmYjtfJKH0 z&;u#pClCR?$Vlf0#$vIu1u*F~p!$?SMS)e|^H~W{0apR5R;$&tx3}Bs>+5ZLy}lX0 zYY?AGBof~b4-dcY?d@%DZEbDhcM|?V;60EjS3oC|cXV`IX>DyC(CKuIDwRr7tJM;p zY~)C%)7fV{9^c*G-d+j@gCArOtK|r2MxtJa!{NcGof?fss;H>QCg)Q$A%IAwQc^OR zlrS5wS5{VD!S)6&pH32>F0ht-cOA(G8X6j$82JIF+z&|TOX8^nZL-e+V-S0b9EI`} z63}e3*&HD1#fX1}LZMN=-+vdg;1e^!XI|e&pPikZQN+X$dlMX8;JR3}fXd3s7OeRo ziKEfzS|AY6!fcGdCCujtk@}T7b!9>Xb*8MN?Cgr?0OsCt_k^!i(bb5$p>) zec#**u#JereU7z_rBSX(jO7K_Ex-`_7SFE4MjPXhMGHW1B0sreR3gqUgEp0-CXR?8iWUIEupm+< zM;n`-o_?Z8o&{`N4xdth0J%z;fsJF#W2p9Aa;MYjCX~BFh{)qwE#)9uVgU)@vU!f8 z%O!WCam@+#g`I^7-)G8LauqEAXZRxUjputf91hIQ&GB;S7F&%wLaZvzdt zL_`)0!k9w8ys z+yilsa;xPhXREEP?ctRSyZ|1b**D?v@bGO+_fw!H|7;M&CQo^YiBU5z&-$B?%b~+^ z3_`#FV26N4SpW-d9azG&FJju`Wq*{O|1UTf@ZSjdBftQ|W7BFcyG|bf0000OO za#>kfotBo?7A7Vp1`r0ZL1G{|sOzvBAS^6g#mC1d(a_K!>wo3t)gUJ)w*`bjY>*g8 z4ydLQXBY?y3L3DovV!PZpiO^)&TW9XOk7;N7Aj|e(*U5K89_8qF@vb6s1%TS7R1-l z(Mbb&1*(P#p8*em0j2?U_AH>y^&oMeOJ;4`woU5MqenhKHTQ9bfuyA5YM?XU18wYq zI=cacL2Qs1P<`$lNDaPdlwY@Q-Gl=N4wwN0OA6!_5P13WCBxgdZ=X3hIGhR!3Mv2! zJ;a#~K#Aw@;lq(Y=X!np`c(lWz|GD5Kwe&ctBsA#3TUEYz-IsmfHdj=u^5#93WzTw i+f2v+`ei1700RK((Sj#+WAtDE0000hT|4FLL?5kvzOGl+|eO97c@L3~?V+cbWD zewZ32oCa`nb3ge0{ksO#*|UHa*Mr1?E}6A$+cv33j~@8|)!fG!24Z4jt65oD-)m@S z^gx~60Ky%`W(hMhGs*q>RP4765qt=bJHV+uOjm#@ka$)S0tl?a;}$TfR4SQH zrxQ_CRmIe5HKX~dRElkHZ?kALDk7auGfwsaQZegxPG44-XID9~l{W)YQ}@6tbt^$cAh& zCxN+>@NuOm0=(ev*4NiFtbDP(z5O%BU;6s`=A=lFj(#H>vTbQ;S)#d+d)$}o3|vJ@ zt#x&EY;A4L;c~g!pnDDY^GW0c_mhp&>1hH8wU1{r&w^a0=e4 z(>(Qz*Mww?;&57(O~7b0zAF&?1Mq%#&+}_SiUitmK{f%q-R?mJ|Keo4Qo#!qCXqnU zH@pkNHk(b5O#p?ng466Ny>D%8oe>0KM=H1!36IB<+T7giA|-r0K|y~l=4(jguDjjt z8-YOJQZN{dVoZcarK%mBAp-IMxNNmr^&K4@F9rq%9%B3$*pd4+q;Kk5q+W|dNQEq1 zOe7Mcg<37AMMtUanwy(nVk@4Lk3zxsdm*s_o%8eaonEhZ5QmE8U&gUmEQCFubvPWK zF#HHC9P~y+Eq5MhOD21-#ho5dtWu#Y?dA6(6S>Q#{`ZE=#+#tH8qOL zUa$8grt3ftK+jFUFCYwz126e=!5AJME}wuxU^Axszzqc(B5{u69^eP=0$UYlKo;DE z=@sDA>-EfJGO@b4I!4ceAh7-YeYUr^$Kvrgi^XCBp1sh$2wVX||3rYNd`hR&wba(u zey~_9r?EZFQXL{;G#YbgXlM|l(dhE-?yftXPETR^{9#*CvIr4ez!WeT3@!Eb_47kR zLoY@~Mjqk~MJ0Wb(>nB?gUCGD@tP1S?Sh*~^BIT3ksiaq8%4t5@OPijS3rV(lbqI} z_Z8}I$qx2s$xlTDG#bqvyWP&Js;YE-eSNnF1_r)B{3cH#nM{iE;IvM9(7#1?WKVun z6F~Y;G&VNUelxnPL{YSAwc2UOoAM+m-6*=SG&t6qq4%Ej$&T#F4{upj8R#;b&G}5Q zwzf7_U0voz9#c4eqB?Edhu0FoIJliD@2e4A_td=X&x( z&7rmp^>RU;L?jXsQmGVeQ=EeH$qP zj_>U3{6IVDE@Pmb#-+ij;BY?_bO-b%dV70&$d2sE59HgbPeN4sLLd-$iWwJOyu;)1 zJd*~`SG&ALq31)|JIRjQFI0LLgclbVm*C_H-b%z9T~+FHISJ@pBYmb(kRx<+S=MA(msiq_Wd=|A1n4nREj|EkO3|MMwiQF zal74JR;%?C_TPeU0Ruir5=eP;b93|a+}vCcMHhwcZ(st!#ZsSSPj P00000NkvXXu0mjf>)z1( literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/cleanLight_dark.png b/platform/icons/src/actions/cleanLight_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..95856c30ad5b904bb6eca478a4e8523cee5a505c GIT binary patch literal 455 zcmV;&0XY7NP)qIAbPy*Iw-SpTi{cvc5Q;-_C{DH%Br!pufs#N?{J(Nqq8OJ99{Bjb z^ZnPHbHb--$`x4xS8x?BAZ0g-qRefh(byrgN7!Vp2f{_S+qJQYqG*}JXU_lyDEU;= zv}U565xNF*bE=0pQTc_l}rs z&d+OHGfneyHk)nHfi1`OJdX>4;8l{O`*yp%OV>Ecdx;|oICEY1mJaMWNs<@$`I){17y!#~u~iDGU?Knj002ovPDHLkV1jp?#DD+* literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/clean_dark.png b/platform/icons/src/actions/clean_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..c07babe21e55b94bb9870e5e34a5cee2a05978f7 GIT binary patch literal 461 zcmV;;0W$uHP)Ot~kk1HY zPXXe~K>iGL1DMbSq@<*Bfy_xj%^>-y($dmdii(PMM7iMKzkjwHHf(6QcI}$o z^XJd60u9sF($YHU@9$s3#Kd%js4)2R=a1czB}wjm=FvDkl%sM&IX3Xq1f2iLInkd{lGBD0EGoM7qFlU zSXx^C$)cIv@h~zn*q!KW&lqE*ladC zxT?C==rckThT%@rG>*8cD!$+Ee_pAZJb}exL6^%Vfj2Qnqkp01IP29>WfN%ZJBlKH zKA+j;av^!1liTgq-LT)>vMl1dZW06mCUH~-0G=et>U27>EXz6&_X&ySwrvy7^Ag6` z;oe*sfI$$L1`M~BX+9Oe9}w5;RU}Q*lxhysC(>5DxGYO%7=~CjaSKY3tEV=X5~A&P z%hEJmVRE{z3x7w99M1k#3Gejd?X%-J3A|S_NKqvKTB>2;@XbLr-}eu2#K__7kxsk> zpwIK6ZAXk8&c?(_dI?)49HUy3BMmzU*n#IpC)6ro9LF4+KSH&RqD4`V^?I#d342sL xzF0R|2aXS7**a+@oPWt?05gEk1Mn-r0KRD0rrZ*w91H*e002ovPDHLkV1kRAyx#x- delta 291 zcmV+;0o?x51LFdaNq+@NL_t(|+U%C$3Bw=|h0l^XT%ub9vq5%gx=S`_$OQg%i7aBh zau$&oJYxwIg#*#!-iNt+L|AL#%5{T_R|9AO4Imp}9LEPntvnV06`U}Ris$B)ynv8W z0!FI17Z378R^d!5zOU;#ZQG_?00xT9^ZeWscd_(+k1t`W0e=w05JS*?EdC<#Y5+$N zP%4hAV@%Aapc4QGfm`J-O2xSV5ENEkI9Qe|USveB;gr^Th|lp1?|$lp!JPZ2Uoe7{ ziDN=+C*13H3<5dyi7HN*>h?1b9oGp{-5yVe8`1hsNJ6Pm`}zds)px>R6wS#z_9rlj peQ92i6}Mlq1{}};{uAIWzyOAyt%$;PGx6$}!9ZDuzlS8x!@Xc0`d)Ol1_QvZXJZ&y)Yd{_hFgG!44sxIz~mo`5Id2@o3) zr4)U2;0Tgb$xd4YsT1F&`m&LQvfbj%O%=wcYphV;wRk0e7<*e1-Pn? z2m%VIuhbRq;IP%kHdZXIV3wvSi=rsI3qur!w=EHM9o^!GszPO1Zt^^5;tC2^1QIa; ziL6gTLi)uwB3B3k+!Xo)Rzv1a#V0c& z(QxY|nPvSv19ZQA5u|xc54jU!vgn&V6ZNM6GLq6fe2@T!;#X0|s;}{V_ z?%^bYfKKCthHi%_G$-NS31QurTDK3CL?zC>6UxUSsr|y)I3XFMf6e-@xN#@of5|)n fPvBn@_!eLQ41Ex9+^#d@00000NkvXXu0mjf9S*Xb delta 361 zcmV-v0ha#31E~X$NqGVg_B4F-EhKY?Spm^LF;V2~Js-@Xl~70ZYIV_y_{7>%wNeTG02& zbhf;Q)p12p$Pn1?wv;qfk6{-HRlLFdjmFDIxqGIa%JVbOqJPBoDY@br&M`@BL;z3x ze>k4v{Cr_aw2C8!u=F2E4gBKAPY?ui-}mRYD2ig-OHl)fmk z6)wapNJS^1dc0?~7VZ_35Da|Y;KW2|--s*$OW>;sTm={a`@BsjV^}P<00000NkvXX Hu0mjfaBQr< diff --git a/platform/icons/src/actions/closeNewHovered.png b/platform/icons/src/actions/closeNewHovered.png index 8e7e7b7db647892909cb93486eec631a6d833c5b..eeb6054792f35310902214e98d46bc4e53c92120 100644 GIT binary patch delta 252 zcmVRn`3Y^Jj;rPoHvPa{vpv04FDBmWYT5!`H80Gk`8pXJllQ z5)~Dl{`&RnTxfBx72`HVo?Ha$Ike^ypjH@aF7#&E%< zOPBa=-@ffwR#w&o)Ert;Qqp|)?p=o~SFUhka{vpv02>=y7AGes!-EG8GE!4h)jxgu zBn9M82TJ8)Gk_6WI{5wjw{3QI_KI)czDaR$aXp(lb!sFlE9)Vm0`YF|-@i8X_4Q34 z%}h*8S3z`LU0pL!+?FT<5)u+JZ{ED=@bBNh89=ND#8YnFx@8w1AD=~37`%A#;t0^s zAA!v5wQJY@4-O8_1A6H{Ff6VR9R?#TF8~A>0EIu1hjOqRqW}N^07*qoM6N<$f{LPS A-~a#s diff --git a/platform/icons/src/actions/closeNewHovered@2x.png b/platform/icons/src/actions/closeNewHovered@2x.png index c34ae1d83ff080b4b82cc0a4419bbf0496945cef..c68f2534d4eb4ddeb3ede43cb7018b30260ae8a1 100644 GIT binary patch delta 515 zcmV+e0{s1{1i}Q6Nq^)?L_t(|+U!=nio!q;o{jMbeFjU>-q%P<8w*>(!b%H4af5=O zf?y%o+FI&sq!q=|XAs1{+$IP}h?(VJHUAOa8u zK+zRdesbwgCb$3S7a9QddOZWbolfVc;4-<-&sJ7}QmJIbVt+A{F-C*IfLg8AR}eC} zuo;`p#>8+Fd+g(qr9cOp=Z8H(VzZ#5xK^uiUDvz! z`<+gw6Xo;yRkPV#!!{a?Wb#xhMVhA3^?J2tvl&+k0IShxaB&UY^Z6`66bgkE^xN%L zCQl?1B;r})@qd^Hjmg43M&kats6tnq5-0s^Bwd#xPH%}m;9=siCtkziVzJ=+{oe5Q zqB(Q9+`3Y!@F3KCiiZAf7YQBFWF(j&mABgsARONeuwPLDnS4H<8;8Te%w#eYkH@9q za=Fm)c%*DLyQ)^JYZrj6aumztlgUK#+^4r(kqb8XgnSvtf!_j94c(4r!<~z=TVMqQ z-_XGZANVSLjLPNmgXc&Bsi$~0RTan-CTDjcSQgI002ovPDHLk FV1m)4|IGjZ delta 490 zcmVAj(B==Ik#Si_A0kD3*?{m)CXf*mNxJo`441BOU9*>2!7JpQ$)xdEa0)R@T5)si` z0zjmbOS`|@?P`d5yWMEJ-G+~1JI|n$$+=XP%jMX9zpo94LqA2gQrPeeKJdjmR)?@& zuagWKAOV>0JTL0?dSHT0CKF!>p(?*#uc$uUY&K+l4V%p-NdRbv0#PcJBG?aygQgt- z!qsX;FS`S+R)0%@001ZiF_P-T<#I_T@f_2`ArnO9a`_FdNGoi3W*W~m^j8BXE01*> zGy|}i9-;4CLT@&k`KQyV1^{V6{|kje)ai8YSJVmsm3%s#`p4t(W7VYSJr9xrWW{1J z>UO(NgLrxduxfhR6AkC{IYIGV+u;LWt1W0W8iDJ&lw;55_0WZj#p2Vnx7%%!3_@-oeENq<&JL_t(|+U!VW(imVXPqF|bz!*R^6^9X z9=9xu83LFz6xNSF#vLZ$lx3O1B+v6&k$eLe;;6AFXxsLS4S!o=1|TD`gGW)6;+{Jj zsHq}!#&IO@0RWydMBpcI9tV5066;7Y6k(QS1)E-jARxZ)lfLh3eiI`2Fbv?LRaF%_ zMW{^xOhy9yGH{p}Cm@RJoRSi z3w8VdH&3uvyKU!rsR#}RPcqLlFU-5H5}uBnT$)o&3RSf$x}%8W*sKz&z_B}?ZsJ`^NMzuWn;=G&(EgHH0+xU!@UIDc3ormnXzI8b S-9H-u0000a&wzmWGhut(y zhrZ96MBy})_P0OU857`jU8i`+vaH#0F2E(b(pn1Iw!JJ%fq&<&>lz|)l}J3mqbN%0 ztcc_IkidycOaRa=LjvA_uXgxG$FUZHBuR?JX}Lq<2RLl;jcpaMs;c1h5(ELm zL^^Q(bn`OLa{;cS0wV${5*R9QT>>Z5#<2i=_kG_;;T98TcxUSGY-leEZjBnMwlao`Bs4)2S=~LFDM~`Lzo$I}L@!|zQ z&7O}RKc4>O%a>ei1~8(h17H|10BzP!N=n)!EG#Vd_U+q8^XAR-2fA_U0?<&xE&%zt zudlBaq#0=IRS*sIMjKFEk0>uJSg@c3=xlGG<{7~7&;!y_zJC4cxoFX%Qlg^q#fujw zfPVfeBO{YtT3Y(Qr>7?m$p6pC$asaQFc^V(0U*Et#~^xiI$VMg00000NkvXXu0mjf DJ^Fqu delta 262 zcmV+h0r~#q0__5jNdXU$N-BR4!vs(uBIA=MPc~k>cyTii505Sz8yh2#*1LT9^48O* zPdB5h1z`*?@bmMFef|2?=jhR+?Hn8&4#$rl@A&lTlNZn+L88Lo&6_t_*REZg0W`$> z;lqaufSNt8U%x*6{rmU1SOWpwNkC^a@bU5KPo6ya;o7xp|AS~C-vD|fPLvmb3U!Yh zInpX6B_#*6^(u%ycI;RiP+X5FFWkF#ujI>@FWx}SGXw<%^?>x04<9~w-oJmpl&EOD zbLY+pU>JPW(9pUH||9 M07*qoM6N<$f?bJv+yDRo diff --git a/platform/icons/src/actions/closeNew_dark.png b/platform/icons/src/actions/closeNew_dark.png index a3002d8532184710dfea693ce0bf2ddad8a6e401..beb7d103cddb60506087d783a1fa8ea78db4eace 100644 GIT binary patch delta 294 zcmV+>0onfG0_FmcNq-1QL_t(|+G70w|33pIfQf-ZFboV}K^N%h?n(txxo;%g-o5{j3uI0LY6i(qefR!-)~i>qEU~$O5j`3?IXU%% zgM-`UC&ZszkmO}`19va!eIdQbIP;lFTk2XhBVaIWdOypfcQT#u`mhf>};T)w=Z72IN`;M z7hB)Gdk->TDp9d;{l?7?KYsk!zHZ&R%76dMaz1hS_9@nv@puNeeg@bcv=yAK~ePV}ke>Sf!^f;=&tF&)<%NvQte)F< z?ri_~@ly^^^Q8|TKV{y&eP?@4PHrzY0~pcM0XsW82phDuwSR5of0000*0kJp` zF9%`{ApQx&jzByMh}D4j+OlQKvRI%7Z31F1r~!dMycH_G42U~`co&kThCplz<1j(# z)j(_vWm`dA0|F9gnnB<#5HA5@L1Y8o0r4*&mI7i{AbtiFXMe-uZIDZk1MwbY13=&i z5cdG_Q6#Ys&@e#;|A2TZ5dVb-A{2o9e*lP`ki=qdL5kxx+|3}WL_ht&nHebGxlihYja;Nb!D ze|-7E!2gPO*?;b$rO^ak;Mg6p^tI6YC}u8BhX1V0U<_h|#6WU*4X|ww1!{f=)Xc%~ zkC~C-_uoHY3}S=CKyn~8LVW@@%nk&dh`j{QUlvfrSH-5dZx6 ug+Di91Al)1U|?kZ4`u(vX#hZg0RV^ecJj(4Pp<#~00{s|MNUMnLSTX*;j?-G delta 408 zcmV;J0cZZt1J?tPNq>1sL_t(|+G70w|33pIfDvRsR8-VfAbT+ouK;3aAg%{uJ0KPZ z;^jch0mMIn*b#_l0kIkoUt6|pSr!Y_piMyR1vMZLh_^z;mjQ7H5br{=)DVbGVH_qX zy&8y(p=>LtYd}B(O*06*1>z+@EQoBtJ0SiA#8N=a3dGN#;(u&dybW^caUkA(OT4hxb5$o~g`*a=B27RfuGp>oHd{L|@g#w~p(^dSnw7J4VJYKx&8z1H;t;{~4Jf=KufukKugi21ab^Sa5~z&+lIu zSU4aF@z0N6IAaQ@0e^n~U|?kZ4`u(vX#hZg0RVsAd=ZexY4&3P0000%2EXyV2fk&`*1%ifJMd?B z1IO6x6L1Rb04I#`F|eNJ%|?cHgM;9GWBeQA_iNy3@P;A&b8{2Z19!kR@O;h?c|?NG za^w5KPdVfHHpKm!UJI<;^ChqjY&OPT1r6|}F-CXzB=}-Lkkhp;a13o-ihxhKpU4>_ z_qB|%P2B%7KtP>6NLlnFxB#B*C*XTdwO9E0C9oEJJwSNBb{=ft_}T`pm?DZc`q@a6 z3C`V*a%--0KfXi}^WZ(c2Fi?M{REujQ@;pa27ho3$cwxS-d<+mn`TD)37~Y#`0mCz zF!PPPa+)*dcprmy!PPwjZWh&nZu^_l@m(&TANSat^8W>J1iTI|a*H86WLtfer4)ICJ;8C!X4?*oR|K7{%EEe&@BOjwx{~DTYW3>H| zG3T}_Whh-|iC=3|0}Iizns!7)l-a{s>Oz(GlxIbbw!-%5TzIFcYAY(hG%sBlxt16D zLzVV((zqA4+(hV>uC1I0R7ZmJadH?BMyjGxt#-z2Tc~*r5lx|!Vo%8O0#wJiaKfNE zBz$1|ZhOwhS68VFB2-Tic3AiAcScP&pB$1f;i{ zku9Cj!>I}BItWVjP+-s)&1K|?g?gwxh>5dW=@@9vC6OiV(8cD2aBZCYVdM83=G?Xj zB{GN*5RoNm?LP}hX5+{bcIc0EPHy3pRJi(8Pm4XFAu^s{3@s0W} z(iF+vI{F9yUrB^YGyJirloQZgY#^`#;Zy@*>Ef);vQ)I xSd;P^_5TYHoPLyEMDY^UNzrBe$@y1+0RZ%YYKrKPLa+b;002ovPDHLkV1gE}2txn> literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/compile_dark.png b/platform/icons/src/actions/compile_dark.png index 608d1a4b64f43e75c69b2889a38f6ec0255ad2f2..b85b82b7db6577933ab623511dd1e78eeda6086a 100644 GIT binary patch delta 332 zcmV-S0ki&z1B?TZNq;U$L_t(|+G70w|33pIfDzdMTa5i-pXg8G%`YI2B;xmz=Eubg`JIom6Ma<@4tUU zdjZ9O-+%uxFaezpqR{}z#{bAR<1pY4(11T+8jBYi(8CWzpnrtH-+zA@{`~s`rqMt> z)CI`wdJF@8|M?BaSiFEWK*0vccbQC6oo4(0KjS~3?Y|j7G>Bh#r)?UcKm;4W#LAq@ z%+9juKNHY^zd!?kG>8up$D#)%K;a2VWx6#N8xO}mMiyrC|9}3T{PpFBQ8rtVa)2MtpezDJlPl1{{nAi(w>XasaUg;7o~( elxAmu00RKn8jNB{@WXom0000flpKfOrrsiMn)*j05t^D1uX1r46K}-41fRqBhL%J z|NdiO0y-Z=qXCeO|B-FRVZa}t0e`?W7B4iQiGjStfD#6O|9|~u`19`%m_`HjP!}Mx z>oE-Y{pU9vWAOsk00kQ$-(@mQb(-z}|BU~Dw*O`T(I9@|owjL&0ugKg6DxBrGds(s z|4cvw{sIjE(jY!a9E%>50A+-wM3w2*Tx>iX`xsf6&Hw-Td-B(pA5LB3#ozGR4opah zFu0R>^xMy`-$HzU|M;;3M1%NP09~y8l8Z3s9l*s|a8h|q;GE$nI b0RjvFhe?TO;goPk00000NkvXXu0mjfWF3=? diff --git a/platform/icons/src/actions/createPatch@2x.png b/platform/icons/src/actions/createPatch@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fa9f97a64c55de9273460f0bae474ee1e323b182 GIT binary patch literal 844 zcmV-S1GD^zP)>PsbD0U zRBAy`o7&hWqNr#g(V|+rlxXQHA|+bH+Xya#Hqs&pT1Y&iq#ue1EbzfotVc>nioKxH z)ThrkGxv7xIEu;4ym8)hI`GZCb7$^7-<*5SJ!c5#9K0lvNUV3gUkEQfh~BM(-QC?z zE5Xi-AaKj?VH^Z{gGk6RSzvS9TPgt(@;x4gL>v|fBoPMz9uyf8{Aby)z=i%-|31-= zInC*O>h|X0*Y3EN;JZP-!lOpPcq|t1W9ae4k4lV=*bk!67AQ&jtNQ?|y`K&KJXsb3 zSwtE!<@V>@@mfT~PFr9Ik@~JCSLWmoM@_PL7F}kqyY({)H%0*J_q*iENkMms$unM7=fhiO+Z+M8Xz?rC9F!e(lKEkUcuyp`NY`oaMi!g5jLarcQ zMj?>R>wnHknuf}8aaJVXGSfFdMYX^@Q&|&G+i|jDbust1Ky&0MV6wf+iK(IqidP)m zDtj)d4-5f@Q;dlcm+m&Zq!+UBs^=pIblE=Yv$cj9F+ zLK(a`y3~3f+a|o-ji`%S5oIP;n(yF3xos%Vi8X-k?Vm&71MX!O~A zhTc05PC*mAnFYUB^LZo%MJ%HiXr(D|XRVcMupUhc11^ygzAdPy8@R;4O*aG2GNY-% iE3L%z|KpzG5MTh}Oe2&#;x#q^00006n+F$&fw|l K=d#Wzp$PyRav|3M diff --git a/platform/icons/src/actions/cross@2x.png b/platform/icons/src/actions/cross@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5a08ab5d045822746cf4748d73ad2bc1616ab88e GIT binary patch literal 296 zcmV+@0oVSCP)>gTzL%JnXlt$J%3;mL&;JuRzTmxIUrU?LAkN3Wl(J9Ij3b%P z0QhDRgfk+L)DlNX+#q-o1Q3YI;0QGEj7DOQRwzoM^&(A*S?fiv vqx;&bHUTQjq?3NxPwTyTUztB8cndH9q{n{QRr-pw00000NkvXXu0mjfGBS9y literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/cross_dark.png b/platform/icons/src/actions/cross_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b8a8552c75f2d534b3a492e9d3450755beb69dd5 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&k$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G>7Fi*Ar-f_1Um8^P~e!{+WtxSiTa-@y4`wf4mY-MKiI&HuqWs|AeD&vkb!WR6|#@1*oSu-dxEX`lMGImsK`CptENy14Pc(&lA` t7hWn~$VwA2%*k}E+vc+W{};^z4CR-k7D;m6&H-A<;OXk;vd$@?2>@mONhSaQ literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/delete.png b/platform/icons/src/actions/delete.png index 721c469e6172a835eb9f8356d43cea81eaadf184..0df8623d59db488ad6aa62a6cccc67d7b2c9de4e 100644 GIT binary patch delta 426 zcmV;b0agC|1L*^hNq>t;L_t(|+PsrnO2a@DhI468Ch2t#?Sn2rUq$fEqBN~wqhN(@ zK+shv_~M(21)&K_@kO_wsB{Oq2dP!#q{(DRu@50l_u`!e5Q4I5eMH}B~zB=YTyU;S?7xX*a7HT(|^ciYkDT_bk>*5-@~M# zXA?tg^CyhK}h#h+J_d|T#X;hMowfg)WUZ1+$?e%J; zvotrImwl>2MAp!^? zSqX=W`zP&*u7A<(J_kYHlT=j=i+a?=MBl+}d7&(P-w}Nuu=r;IYBqZ2*npem`7#*H z0meWQf_rbSMMXVn=-J4au>semxiZsrM>h;mRV5rQ9-OwRs3(m)WNc*3NC0S1)eJTm z#;ck-JR2Pt^`wzU46-Yc07X{nvXEMy%dP3-cI324BO?zP2ic9W*Z8l0WB>pF07*qoM6N<$g5zw+m;e9( delta 445 zcmV;u0Yd)i1N;M!Nq?S6L_t(|+N@LEN&-O`b!K&T{aN)L?4ll^pl%}QE-CyeatkuB z2MFpZ3VMKwy3(c42<$q#DJs10BHtl&)opZl`o1ZR{OO_`7??TVIcNFKH%o*Np8qT| zHiM`2B}Nr`4)@FHeEDh^`Pqmk2_b3MakDe#4M&W2i_EW{2Y({rj9(9#mCfa3zZfy7 z6_A76F5WZnX=>3Q)_EWrVVWK+R5s#06Feh^HRK?7Xa?2&T*{|u`3`?)&9@r2Eh~e# z7J@HF!_3Q6-nMNcc5qT08De!Wm+~?OCY;$;gMS(XLCiQ{M(prgJaP)JyW7%42$x9` zp;A0?bXM%=(tlxT+qJsucG@0AQRK!mU_<9UVDOk&ObEv@MaN;V`PXKE6`+><^&vg1 zEF_>`Gob6xvyTf`7?MN@WYT8MdL4poWM;2#O9KY?@%e-w#4u|q27xhod?9;&*;#{3 zeA1*Da7 diff --git a/platform/icons/src/actions/diff@2x.png b/platform/icons/src/actions/diff@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b857a544fd1cd087d9e9dc0b11498cca1c5d1589 GIT binary patch literal 1118 zcmV-k1flzhP)NMEh4Cm;6Wl@kP!C=k5U@(AUuhCP{b`F2oVG?M5Iky6&{EnC|awR zbAJE7JG17@&e>i>JecOo{GIv!fBxId?iv8V{^c;)KOR0IBoc|9xI+=^5pxm45n*Nj z2jUgtDq=t4otL4P6B6w4_PK5cdKfbi=Me*QaLAzwj@5`oh`TzXKj80E35Fmp^21+n z!%>8xppfsiAO;~WAxd=yL(y<{3F7g1zJ}Y`+}ykw8Q{QUMI$|IOzZb;7GxQ+9FXCT=@Q@dJ%s7z{VY7#Y^&F8JjWbz}f zliY<4Q)ZasKnnR+_6q(7#1=#y17}v~(wO4iJ}gFqq=5PMhRI z(*74wZn0K)ZQuLIje|AFFCZPA12HN?d3kw_X_}96H05o69iu57fS6<3B(Fo<@lpa` z@ZPr>t7@^IqNJm9U@&5mWm&P(($XC$H)`xqhcBUw5|?zao&=IR5liWsYxJIfo;YWh zZ3Sb*B^@sZ2-C3J^KhPr_$cjvMJzyklKEKA6!;qP7jiC>*E$MH!pNJZ@Lji{L}|!t zJfiCeiylivgUWZZKTDn?Rv<3$W+sPTB5w^MqU!jR45%{IbgkqNQ#p>KE%{}{PQ)9; z1I`;ExU!Bb!dP8lV^)ez1oFMV?nkA7zmo4b8c}ThQavQwE|s#Zy1Vw<${zna`h9M$wVo zM7W_%(T{LmRB*+tI-vV7B7>2$PG$NK8<^c~<6%yQFQNvP&cMm`aS`@$MB7+H{?N*m0qt1Ko*3s~YQ}RqTXq1XzM}Qx z-{Xcp15&nt_1=Lqb`@CMBv9rZW`J~$g-kPHMPZXG1INCm9TNMpPOltTYCSdTU`i%T zNQaVjL&W;A)-fI#0M@S_INeXu9-!tQkQ{{@% zb>F2Xp!FkPMrkwP((8)@t}~oWA831kIXP_fqX#l>R$EWg0^P=-{*{E(&>K45HlBqF z`&ojXvjh0$*I<_4=e}RkNbMQy?>IntGA)Y*!XXBEd0GlNNSsVg`|=L-;(YYLWM;tZ k9oKz6GyeNu$G-#^03ZiBFB<c2I)Z#@d zO&ffrtxdBt{{ME?PA0S6q$oW&@UeepzJKQ1@Bep~XpAv3pF=0}JWMa>?CcEUrT_;3 zEr4Z!sI)!~_yp(%oB@3C+vxmA9qB#ZQYau`YyeyZ)Xc&`K`S}-0JZ}jsfZyfR8|S< z0N459ANa;LK$B3-*FFLk0B!<2T_-(c%&e4GmQ)xVcm+b(nAdK9|d_9~~Y22C)Tj z`Mpb;2G0vZHU}6$4V{!@Xf`X?~UJW<$>ruyF3A#ND*Uf+tVf{N`3m_x%p`I@I9P+nuE)nO_EF1-1lf*B03KmHXd7IzS zU4Q{-1N6&$TKp~P1MCJ|5t&1&vg9`bCjp-UPdTsN z_a1YG;uPa(W^W)7pKuQ;I#aY7) z?tlXhv>LAq4q(Oa0i^@T^SF$bA;3M*+tN_hwnPUQnNts3&aYy+!F#}Q$S(7(79c?F zz+43s9B7u*1e#y7{5iNB0YQV&(s||fKuNDS@2)Op8(98VPW|U2Y>`Oy97|A&08Q73 z5i*s}q}#i=rjdUm0DZzHwW1Ni!eJ!^1-gyQioG@e!ug;;C%UDV#+7QT{rCTle+w`G XmLR>+C-!|m00000NkvXXu0mjfHqXe6 literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/diffWithCurrent.png b/platform/icons/src/actions/diffWithCurrent.png index b54c275352909605c52e2b15af19000e5a6f1af1..7ef53f380153517fa9af186f4a4039f96ba8d5c9 100644 GIT binary patch delta 347 zcmV-h0i^zx1DgYoNq;>_L_t(|+G70w|33pIfCWT!cXyLw3S(($DV)Q^Kp|j3Hkky`u>Fz^5O zpHug-7{xgKIM=+7!-!$uA;TeDa`~iv0KoiFZga0r;g21^?h0}lmn#s(`&cMvb%5eE# z)&IZWe=_|0`)|4tUw;<53&5rVHP^u;YJHAms>?YrFmkal{AXhV(;z-b9K#Esl!ctS zz!Hp141t<83{(<4sto@ae}icdA0$pp7=QsQGY3PMY72t`yFQo(@$seuWU%?*Nq9i< tGK4bhJARX3QpTHPapo*avok<|0RRdTY}v}&$z1>d002ovPDHLkV1fv)r&j;~ delta 342 zcmV-c0jd6*1C|4jNq;y=L_t(|+G70w|33pIfDvRscXu}_rZAS4mcltq3={$uWRr&e}X>}ash+do$nwMl zqA|x`1@1o#|9NpKz-0g<5}xtr&mWN33^Z|!F!&GiBM6-PR5%S7pqb2^>FmgaH_^GIKD5skSgEu*jlKOTNZ#qkx&Kfzu%@Z)xz3cO0pS<9pG9BiZ(`%&w&LXH zy$%c&UPfl-Vk9NGP)uGLATl+-5q_3c^M&uomcKlwHUIr#4rlnwa26=O1S#|;<0~O4 z%>^Pr9L)Je?+ODm&?vV5qCoy1dKX02%>Vd){`vQhfq|8Ybs$PYE)ene?;nQ$j8x2q zIN}T!UilXo0{Z8#?0`K@jn=Y z*vN94@{SB%2Bk!$0gU(p`gjUbsrVbLh>?jQ*tm&7Ue=g_RgfEunRz)F7?>Hr7{rE& zgVY2YH8C(TG7*jfY)z(pllNlP#LC3Z5T@D8u=rLH!~0*)pz-z(;tMuLpzE0#1lgn* z!ql3;1UaM`LV*@B1L1$5#URWAgdj1H z99;?`X&y}mFS#NHSgjhMSPd4VxIsb+&=qlI`1I=~13NPhgPNclZMN_}(!HMReKLg%B-6$&7h|k0ragF#|RRLxs0-7E? zL6pFvM2F-;aSo;IBgGS?eiaJne%8U}+IvgvOUV&WK!P6J%`@4{*|e3kE$f!Fc@hv7 zii8&Y{`AnKQ{NjnS=kJK_3xSG1viCR7(sXofL}e;zuZP;Eb(o&o=# z@ZU6i==b0LBrc|#p4^p*sie$meXZ%i7i7CJ*X}yB@!p~JGUQgHU=MLN{A2%HFbrT( zXrz1ow-eD(ohLF}3V@Jq)*=(e)I|sm$f_8IL2LF3FBDlBnDGe2aQ97h`#yeY)LvN| z4I1PSyMmPp$VWkOpi3!15KceUa=qYZ8!rKRw0^vu@{H7uxQU?UB_$p7BOL^|6!s}# zx%nN{fH{$s?g61L`nMC$HEf#KVwZ$`etr zh}n)=8C|Ud+sxvZee(h5hb?D9r>wSI?f1uxW>VNC!e9{2{)|5bzLEj7Md5oCp*jMN z#IKhctsME|RE{dY3%2FUsph9*_RoJE{}x~X_fe1$Q$Z`c00000NkvXXu0mjfE2n`` literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/diffWithCurrent_dark.png b/platform/icons/src/actions/diffWithCurrent_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..7161f6772bd376dee12d63f66842bee6f2f7609c GIT binary patch literal 428 zcmV;d0aN~oP)?6O6?l7i<=K z7qX0rgVhhn&j8w9i!4t}AR4p(l;{4-$iPcXAi}|A1yrwaeB+)D6q^BL&VY&OK4|@q zVgN9JKmyI6Kmvh(@BjQ~{LaY0!o|+;kK;cB^9Ppyf4==>_|N&Dfk}{s5j_kTff_-$ z4j!k+VrDZjNIqoZWdk~ai2+1|_#knNKtxViQ0D=Ii0S{oOLlwze&=}gkNFP+mK}gR40000b&L_t(|+N6`uO2a@9#*?&ZF(B51w7pkS#8&NV2nFLF={j8H%SqK}w;QA_{GGXPk+%X-IqPz{kw~cK6H9vau1-+9qr^==FMO zwnw@rU6FQ$eUsivx1_mQ7zBakY%qNw9guwffXEm2m|Ywjgnwb^u!LQbZb%bmul5o1 ziLeV^(D%-qx7@Ll7*KfCYPCxl<=7$ViTProJgGyO!}H%!R{?rygUWO|?NA=bcu2Zq z9!07m^-$&pA8^M= zXrjy~FdI!lZI!bIrQ`(aG=AId{D>b=33c++O<{w^Qq~{|*|_SLTll}~gyX8MHG>U* zmTf&RPf#zTc$6!+R?%e>+h)L_t(|+N6`uO9DX@$9Gp(X(6&hsCQ!}(#n4$s1AYmz+=!K z;;kPb-h-f^>?-~Z(#gMIMerg~pgZ$k@2zjvZT04Z@4h#mnfWqrn6(kn+9tC6>2|wG zwnw@rU6FQ$eUsivx1^a_*lM*bXM^bj>44;uY>_YQF}*l42!DdWVF|k=-H^u2UhO01 zV__G(py!=AZ<%8!HlXmz<#LBI%CQ5|6Z838c~S>5hv&b;jsoVeGlKj5$p8cIn69{?(puSuVzCTYQ3Bl=P^>+zZ&uqz6{Pa4!jGwE|`xYk&c zdMfubQ^b_;tba^4gF<`)bsD|xW_HLAsDL_t>ZY(kViW0GJ4ui&+lU Q)Bpeg07*qoM6N<$f+SJYdjJ3c diff --git a/platform/icons/src/actions/download@2x.png b/platform/icons/src/actions/download@2x.png index a596b7bd4a91675d56ef011035b12709f072f61f..7479272ffc3d9ae911678dcc253e8522d6433e7d 100644 GIT binary patch delta 718 zcmV;<0x|uQ28#xeNq?xHcd(t zO`1plf^=Y*-C=j<%j~x^e~6S4R#UWEH|$A9lW2mdqc1K$PJcBDfYh3Sj@v!m1V~B< z0fO^8xc}0tE7N($GGMqp)4FNQbH>*F%;heyyse}AT)hBXwQhKNev+G(_1qg+50=jl zx@n%>m5iQp41f{=@{?wo;PH9E-Qopm7%@iy*m?UaLktpQMwYoCk(p*Cr#0LZhOMgD9f>N^hi}59tGNOFc)C+b= zB#a@rp@y2#j6)u_P9l-`XD^Ty^a&n(@!xU#N3-bKJ!sT?($oowHkFZMhcJ4|-UZ2 z)6q(Aqp2Sx&6G6&)i@y6uHe51Kvw(j`7Z$m06`lthG|Bt#Q*>R07*qoM6N<$f?vc- A7XSbN delta 726 zcmV;{0xA8A29pMmNq@CTL_t(|+U!?NXcIvcezUW)o22Q+`iCCsL0U>g5k*=HT51m} z=t&U|QChGk4;8crY0vSdhg?MH&&3`DDIOFgf`wLuUc6|PUZhqJ9u$dfvdQkwjBnDU zRMEt4;ufS2hWXi<_kH{Jn>VvWN(mcjWW59qq`FdA?Zk5L^?$(hRNw>--tFloK&FHc zAUGez^;hSv%{YDu=<8izgu*k-G_u_D8Va_3#dBPS!@Yq;K-q~$iI*DHI_>2g*h@>` zS z5%9Q|^*C3N0DrMG2A+2rvRtMPW4psxJuyNdU8;pw9z7=)WF z2*sjG`6~oG5AvC1u)lo=%#6Rfx$|-8)eT<}&~$AOL4PbD&|e;-3Y3zSH^!Y%j))qg zCM(vfCSe504c3&3+eUgQHP{3p*T=R)hadZy-70k7#a zQ~-TV`6z2&Y#GxzWK`++&^o#$-=J-<{pMwtKVE-l*$^q@K1(pqd8c<|p{?36PEcJ^vxV08r>80d~#l@Bjb+07*qo IM6N<$f)9FJ761SM diff --git a/platform/icons/src/actions/dump@2x.png b/platform/icons/src/actions/dump@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a36b002a35f7d364c59af81ccc9dec2136a1c881 GIT binary patch literal 1171 zcmV;E1Z?|>P)AviV>gPL%o3O-5l4eNe|X6%pqLgbjm^f)6revoa{% zy6S^#u}!PcS-VM+C25l8ah7qK=y6U=7;#fLq1}-2MnVw2kde3Zz@|{}k7c@e z;)B7*@N+<;GTdx8T)h(W@$AF9-gx~@ge8hKpRyeG=+>`o-3Bc1RpWu#Ku5SAJ)hi{ z%Bhsh7U=kFoIEz;3M8}YOImylbd>v4UfW}#ksOE>?>W3Z!~Nn?-v7n9$YlXmxWX&( zSFCX$XSpv(ZI4(Z2C(8hGTK!9-C|QzwRYLkB=Ra*i!{;bEpT%pL7@#sa4wu|wVNh$ zs=Te*B9lQ(>Ym@Kv7|vGGIt{eY``(jA>+( zI#G8L`r52C%7b))`mVE3>(-rnk9w@iP-*rTfw^~|dTnnI?AVMo&+%G}$Mhmqw*i}d zP7$*xG=nfW!G4_8;?e%Mb~Ra)El#uY9gxy7;xH>uVs0nPByw~NA!vq8KX*7qR41ak zL(q<^e#b2?@zD=axf`VNAU6CSod3jq+XjZqQ7lf$14F-J7Q}5xce%u2e7>tvd0tH| z=*1D<2rmxeMr5$@J>dNru;PC3{@or6Sz9dR(u>i-NS1zK<&a&*nga--_sX(d@dQGl zszoc{bx_Ezh{4IYd;!$#<6?yGJIV=L3>5BkiI3OY=mxzU*M5*xd4!N&&$pw#54YLG zC#Vl@rf4wS%{s~OgCxQa5}ejJ@+OMVbyxGe(I;82&=ONq!Yuc7nI~CCLr=0gTKj4@ lU)9_E|39Z|ZNQ%b3;;v%gBqyxdn5n=002ovPDHLkV1iEMHMjr( literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/dump@2x_dark.png b/platform/icons/src/actions/dump@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..0578a1cdcdb68cdea099c80f4402bbc25eab6445 GIT binary patch literal 1272 zcmV)(E*vV-144?_R!Wg5hpvaJEL zBq(A{3xr}AFw|yAyo~Y2*q)jG&mIt=*v0Nb4}H?7Hy*#``~Ua;@BatmI8LyiO(@vs zw(kV+&4-STj-CG{I~(lp*toB+?_mPFwD12_52UboubxS_VgIc=P*PIzk8Wf?SQodr z~1?bZ9z}VQ>*2|ijnq=dxfFYl(ASaZiu8)ec zDp^dViJv9McyWflC!@W?s^Ibvym}PSyyf8?mj8i3OG}G@BuT;e`1o$)Jb?b7M7`+E zE`B;D6d&F>0Epy9aG4n)AkF<%?O*yrPJ36;(g4j~q99f42dll5Lf6F!Few*{hN-2Q z>&~g+n+s!u^Ju^!Q)9WVs@!A91;?=w1Zj@C z=-3lawV%E4^^+XSaswatbhA-9zzD@gSVP4}PTI+c3`e1K5Ww_u!2G@eirveZlZpA(RtS!Wuxv0 z8~JA1ZHt5g?wv5yo;ZfaIwptWb7CS%C9fH2-vNrngz*qs7$2NP{m*vKgGq<~yOiQW zNW`e09U363&$J16t)McB0*n*HI7~on{ti(tmk1XVsphaO!=PTO$Pp*94j0Qb3{@B? z9Eai3(npS0OkBS_aer=VNpT=wnQBtNy|#{e{gE0&!U)#GOLf`=3UD^E5E0^qx++s6 zA~5}<)n3uiq)#v}<~B>0kdP=uY{Uj@czGd8I}DL>)oK0qkKi1G zQf*;%b7ybQfub@cgd0PxEN-~$wh#h(Mw_b(iWHkFh;dw4>tFno&y2cEb3rq>a1~PQ z2at?j%2MZ5o_fCfLr6wHK%CzqM{dn!$ra+_qo&frs@lg;GQw~|3Y*hlc`wW@O_m1| z7nJ`nX>D!gQq%)m>DZHPcow9&EEQuB8znXVrBCFv$B--?TPzmrArGV|LInH*?U3KC zfX|S&gS?tR;i|S3B%VY;LXGlgUZ2YHOiQxn#Kl~OO_os!b!C^5tURNVERCky>*9N= i&Hw*6-ERWF3ormZ{uiA4-xUM^0000s3=3dnf!c;H@fe7A1Mw{&{sP22K&%GDu0SmNTu6&i z^4+!na4(>Nlm8f**L~oTw)@4x<@=wJNs#gXzxQl^zMT^I@^lK*|Gz;n%^<*p?sA~! z^>6r<(*H2C^RoW=9>DhdE0_lIc|hVId8i8+u(@C#$Yvn@l*Py=0Z7jQVlyB<1yq>$ z=iHVBKzUoC&yPUfOTy-YTR>-92Y zGXwEuv?xCZlox;oELH<}Kmi7%jevML5X&LSJpqXWxcz}W3nS18H)4yVW zfBM}C6lz?yY#CUN37@H4X@d2}KBj3r`uvi;=~QzJG_FMprEV2~7-TE}sc#R;oM ze41RHU4wsnGQ!oez!>otE{clCNGDvup$Xk($Tn(uKY6O){_Mp8LYh!)tXTcgqa&36 zjKMz!2gl!x*AI$IU1$5t7JP8mL9C$;xAFbAe-%K@dw@*WR55W!kS5wDIZ^>YfB^vW X=93$P!l66>015yANkvXXu0mjfS^b6R delta 295 zcmV+?0oeY~0_FmcNPhtcNkl{137v$bK{w`1@C;Fo~?nI+yDRo002ovPDHLkV1hqKk`Vv^ diff --git a/platform/icons/src/actions/edit@2x.png b/platform/icons/src/actions/edit@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8645fcf52f3c04af97690b33c84cf706c96b7144 GIT binary patch literal 656 zcmV;B0&o3^P)1RCwBA{Qv(y13du~1D(O}w~z&0 zV9Lu`BpY($#Pz9Se?>h1-TU(m$X)%!^2kG^@H@d_{#EV5N#TYnrxEX$Y{Q<*`{JS`6i3(DpeRlUow;;b@i2xrz z10xWAR{6s4<=J-z=Id}JO>FCcqys}U#Xh`#_j)JLXC;Ds0$|Htym`s+;`IxLznY8; zKa~G4eE<3#hQlcKAu!Im1o?$Z1^7`dgMruLZyEjw{a_G!CcyAp?jIvX7J_^xAtF)A z#mR-$vX?JjFuZ&YJApncBi3j5EF+joFWoz1Jtk#YaDKlTdVNbRG25lT@qB^ zaDl{(fJLzFf94x&7#K8QmI0G~;K5x7DX)Nmz;4^=w{Z-A{w_{(5)Fn~nkg)%!SLtb zjU&tqH$awAt;PoeM-Z{?{D)W|wK&O91QhI-KsZxO{L1N9AD&RPi2(!(K)eWu_X90G qa73Hs0X5q+jHB(+A#Wi-fB^s(mp~X}igqOc0000k*3z^9DS&0Cj00TQ4JKQoD*#GJf!|rE$8Ge5M$#CiO6()*;6zH=q zY(9g57tfzFyn6AH;T6!QpaSd**Vm_HTL|=7H_T_)EPMI<1=unexX1BuE!!`)5V9-; z`%FZF>AiT0qPY z^z*B{=bxVksAU;$3qOC?24WD+VEmWCA)b@_02a$OkZKv$I1F3asPJ7xg@;YnK(sW@_&3}LX z-Z;X{a06r+)oOeoZ~zg1-rtP{QcGCHbQyv4B@oUO6Tfo$)rTikZDIg{0uV0(75qR; q52Q25KA>ishH5`5kV~9_t^~OhuM5r}D?9+kXyTbS zIqx>G^09t{g$FJd7^1lV;s?bi-kN6Gw%7k$VR(P|O#?my)&Xq?Gk^vKf#?g@FV-8F z>HEBR^OE7G=3j6^e-Gje1BUnu7ez&6 zq!X^7X_ga`JM7@>7)&T3fq<6xlcx&q&t4pWX;$P@IB)mS5+xxq;>b+S4{u*dDfi&C z;$-RWkW$v?m<$ezo j-ixjd?gDZFK!5=N3-`EQ!8IDv00000NkvXXu0mjfI-i@= delta 391 zcmV;20eJq}1CRueNddBvN=<*RG(iw0YM`l)EDUzlzm-2gE^%fG=U|xfau&md>lZN% z0D*6_-k(3lZ~)A<>US_ilFGg=c6-XFn)j;A@~mxaHeB^s4FI~r5X}W3+nAWOnQOJQ zv?Q*vU1j*Z?p+;F_&+WetV41^5J)qSc|}W0Q{vvE`wV}D{xdMSvNM1DJ^Z^GmkWYm zE`Vv)RoBr3Y5w~CE5p~XUm5OyyvrbCC36m!3p&9rU}KoWl_0ngL-XCc3<3gzuX!c- zZLk_JGhVQKp@BZbt?L($D&x>BDIq2O<>lw!Ojv9O(-N02vSj{cws`dLE{bMBKH-lb z&Bpphzwstzb_RwBnLm4fnF>CBXZZW=8$>g&&===#HsLVMSQ8Q`+0MVo;C$=Dr7~p; zb_Q8s(kWwPXJ`_Zer@*NyqWnQ^NxeN4l?3200!RO_@+C9k?F3jp1`J;&m?wP{$}|F l6yA%jjuDof$prub1_0%~!uCM?s$l>C002ovPDHLkV1io}yWOa${qqapq>;B)OJ84sg7WwK?uNTP;@p?0vE0${4&R3D$x$u0V0kS9zYQUI>-Z$9+2e?52T*t2pr{~ z@bBKAZ$SQP1{2hhl2`|LkP-qg%O7e#Ph)E(z`s0X}|U z>SSd2tn!87%d_tc%-7*cn%LF>Ne6~zVjWPABLpyNzUz0dcS^`ggm7_kfh~XW<|V_6 z*Dn|tG#MFw|N71F|I%-m(l8(<+5wHkgusn^H@gJ+g-QkZ1yC)Ag4g128U6_UU=VsH z!0=n{A0sJIkc=Y)=A!sqM4}YK=TPwS#S4a)&w+d?U?Bl4B{*fco|EE$x%fhWkk8?k zLjju+=X#dEY(bKw$_eHZvRqC;?x=&aV<6QUrT>2X(h6n#D=+f%+aqEuxBG0_MAcUD-*4Zw zfS4ip=T|w;KR*u;VRWOa${qqapq>;Bv~U1Pj$om(13;MU$006>#>bY6>Z#!XNxGB+c)&%hf@;_GnbbHKpm7Zc z|5pA$2??ff4u&Z&XMx!lt|N?^<1m$I2k1jBB-Mk*fVhJiA+Q7Nid&lKA>cv4@`i7Q zzY27It4>yCSNsm-ufD)=v5p)Ec#s$ZM?pE@k@oXUZ6Pf$nZHsDKfnD1iPz>Rrv0CC ze^x!I4w!=@1X6GnNDsB1WeCa%1-@c^!*J)%JqD>S;xM_oB*Eza{gaDRJ1N*b7p zF9Znr9A-HT+~<6>itQI$I4KTr#}WeffeyMwtk2DoNA5Ie?NX{1u_0rkofuS0Wp@_ zelqW%N~<`6p%YC1{q|i8h#CBUepT@M_v-*o%Y_sUKrOGLTAL8mnE1;lsEyP}a7gCl zKG1sijsu3}AI&?VmRq4GJW@j7KMb#6DBtRP>2K`Q%NI?5fBF9F@7M1PAguT6uY=2f z&KGEwcLABzAj^T6nOY&RMwa1*KJUldCNJ;&J0mKsq{qbgpAB42iwa8o|NZC1$-ivR ztUj7{L49sX$Z}F0@I!#%HMnWU_vM1g>!<%uGYM<{{``yW`I{dc&xL*{Jhl4825R+y zT0Ex2SWa>pU}5+z_=!Py>jwt0%lE&iU3~sU{u@wO3y8&l*Z_!KfmjG#pY3~doSjp~ ef$p9I1Q-BCq^hnw|E?ea0000|62QC*F zBD(UtP)tS*@HD0)W zvED#azv0E3mkdX~oM1Ti`6R>Fzh6sX@+^cjy?FhC;pK}L440l?V0b3~{FDcS2X-5= zX?pqm1%srx)VdJS04J!aQw}9{h+wib+*53!3TF8#2V@d8~^{Q0BYU?WVxn_ ki93Qc(KgAE3IGBO04QITI_=?c@c;k-07*qoM6N<$f;xzjqyPW_ literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/erDiagram.png b/platform/icons/src/actions/erDiagram.png index 91f3071d74fc4228d1a3b9565310446976bdd3ff..b640d77ada6df4027008bfecfcd9615e05706f41 100644 GIT binary patch delta 267 zcmV+m0rdX-0heSaefwW^{L9a%BKPWN%_+AW3auXJt}l zVPtu6$z?nM006y7L_t(|+G70w|33pIfDvRsQ&STzQyB4SuB)qKV1aQ=lFU&g&&)eX zlna=UIa^-rMA2xnb0y4W|8Zc13qZg}!kvL33B`g&kRfN>!+&wQkOiNUff^ft27s9L zFc(T}6F@PH2`R9!VXz^{E<|?;3$f9KD^QsT1QIL|8Tb8DW&q*_bQj``Mr2!o8bJm% zI5FLAL|4Ot9*v+tLN*YeW@4g|0iR}~T!2qAu`XaB$^c^1KGxhw2>=K%0Q7rZ<`C<4 R5C8xG07*qoL;8vFFTT9qb>hU9V~2oh9(;WC{PU~zhxZCD_xA)E#Z?mI2Qrd@!O(E? zzkeG-Tz>=ENuDl_Ar*11=Og(JC~&w27Az`Fd9~yJ)-bL|KOd{Us diff --git a/platform/icons/src/actions/erDiagram@2x.png b/platform/icons/src/actions/erDiagram@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..56192b72c1bca6360e7a882f932ad051f33f43ae GIT binary patch literal 434 zcmV;j0ZsmiP)(;&3noWcaPnM zi@TM0A}jL-I>Pjfdw3(1PgWXY!6hriCcvO)=m>BW0D&kOX^3zLkl+Y! zXmpU8hEN>9NP#1^l97g}69VL>A(}aW)RJ;g)dl1>3>cB=egBk$fmAS5Y^@X1-L-TJ z0ifleGGPr6M*{IJLY9+N8{&#a-@<B__4gEDca%IknON_1lDGqyg%O010V;x(=XryMNHvhKwV= ccMK3<072uYt*S9r9{>OV07*qoM6N<$f?Tq$LjV8( literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/erDiagram@2x_dark.png b/platform/icons/src/actions/erDiagram@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..6408feae149809c9e0cb13b12cb2c135343560eb GIT binary patch literal 431 zcmV;g0Z{&lP)w1xO?n2 zT->e16Iod>&=EQhV{#gye6rFI3ocn9HUS1@D-|%t0~&yiU_f#Nbwa>O$P7&1J$46Q z2&@I-NT?&O03AVA8e+kx7+(kgEnEw<807PMP;^i&1V~BcKu3V100`8`NJE4}fCNVb zL!*P#G=$;+MhYCUmW(t+oe&^54bjX2q?VL}sxBb6VZew?uYAcDjFc_chKqk%OScdJ zS`I1`)x40dg%Txi-X>pP_M1mgUr_4H=LU9LbiG zTpQvk(a5r#qS_F-S|%p7(<}{8VmY9tIL^rw$jrzdw!TKU$)GNhk-HE z-%{k{^4s!)PnpzG&P@}ymOOXHn)A80{tSlVoAojh519l$Oe{!G@Nn9=KrrRR#-^1Ig~4&%W&Byx}1{rUgjp4paBn0fBO6|IZK`l2kd6yGv(_iQ|N zuVqt;?;V%mf?B#C+MK!#)uS<&J*woYBJ^5MT35zIs jkmiRVQ-XLHn0OfWiwf*0Y`nk=w2i^j)z4*}Q$iB}BRoX| literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/execute.png b/platform/icons/src/actions/execute.png index 7d84dc9008e591afd2b59c64830acea10892d7f8..c1743248d995fd0fbf8b4c8bb4a3947af23f62ed 100644 GIT binary patch delta 397 zcmV;80doG?1Iz=ENq=rhL_t(|+N6`sE(Adk$7?=&zQ;bm-jE>d!EGfgOFRUTAR-Ry z#En;A$x28(01vSnmWzawl?dX*18}pm(_O9GK}O8RY_^g*bh`Ri|EjK1IOouh>B+<7 z$(-QvQx?<8-A3~x3qVaCoG=70ms>Dhr&TyAmwN{276B{pC4VSSJg-qWp4}a*l}Kg) zll{;%FdQ4~FjTD|*wP8P8LgGZvjGr+A_G*!1u=jGF4zOXgyA~3BZt$Q!__JE9{~Gt z(t~RjiB%;WU zNd^47ta}!979W=Ct$#;32@oTV7_$S~j<%oIuA)r4AioYd1J3Y`bwsTz&GVj?iHrJK r1ZT9}sl2RTzh~J6rQdb_5?}xwHo4ckL}&y60000EF7I delta 410 zcmV;L0cHNo1K9(RNq>7uL_t(|+N6`qO2a@DhEMKk(lqn|-04OT7w#$u6?_M8pd#WT z;zD=rGuRdvE_?vp39c(z1rgj?QM9(haz1!W{y&p?U zC@TU}$;Sd8q6dvk5WyFthls?NUZl+MEqb;HiUWf(!a$=G3L^S>=!Yn}#~y;hdMK#F zNV4?K>-Mj2)-6drZ%;iBY2jmUXJ&7{`R1E%W~t*iq?i{YMZN+{eX+B%Q{0v%Un~}* zYeRwf!KQP#_0-*ZkZr^rz$7pYOnLVd@XPysdrtdZd3k_I(kaT=RS=PiVnRjNNKjSU zDWxOvwgbwl6Hvn;qD3Pl$kkTL=>1o1jbX1Uy($C(vP^g+3=&Zyb6(FVdwe+Yt_)SZ zz(nD50Aa-f0VtspE|k#tZo=5}jhU2%+Vh^#3QK?rB|w5>I&>(ZXuPIjBGFZmo)VsT z10)MZz_FbfU=cDV!IZi?9XeOm?fsEBQTIJjjb`tcLc+~~m#qz16HN{2BwD^fu=rah zNfabFRB@FFRVF8|@o&blr)67Tpn82i3F|5lR1_iUf(R-y!SX}@_AG=a7!!tsC&Gm5 znqFZ{_cxAx*pI&(^TNo#0(uGDt*Ti#IdiU#HO<_+9GBpYp9hRo@_8tkK8rj;!pUoAJq_T_YBM zgvZTdM)L_KU(3ZZOxKL_$}!3(mVEiOBR|9AcF%NEdFMc`%gkiNZaBC2^F2!)7$re* z4%q3Pj;0HegtlqU8g&M5ZNu1u&P9jEflxtDME{u7apJaZH(v~tj^n8tC|TrHF(pS< zWHWMM+Yc?%+*f&NXxyt=taGtlp8=Yde=45oe8@Dd_Nps4Gd|v^1&#vRicEp+*cS}L zI9c64oGUEEnXwtDUr`U#4&3ST(M*i?5U_1kK1>#v?-nlsNihiYuGw!x`rm&Y{}x~X Xu50tR6nPQC00000NkvXXu0mjf?fb?g&E1{tKkJrho_D9-i8SzMW@qMZe*fS6<~O_8aU8Ukg`hPqzUBU~y}g}RE26KZ zr3J4K2BOERdAh9?cONdA@yN(XBUCYnDTugNCn0|Fwyx{_f6otvLi@7P01QmdmjL^B0e85p&`ndQ0aa|$V($OX~XCxPjtBjfH@NYg2Hxaz=W*Q zvOR-un+hhsa!tI4NaPHF!<^ZGLr91KqSV~&pt2a+HT3RG#pLHwnD%iwAY31KU3Vy@ zqbYt38HF1;ia&jVfB^&rR$ONM#fjKW`prD`JiPT43~$KBVO<79S>}{38lo&AIDW7` zn+vW9LbxD76FQ=rs%I;+Npj=h(N|Ljr~g!2O%rKgoF95 zAQvVQ9krhZTkmh$*$u-KLdpmL&r(vAG&*F9_Jc2gNx?Bi+!`D~Nluq}Lw4qO0nqBk za*q;hkt|Ej4?S?PH?ZXjbQ#=0y}KYifZr-#L9xHs`1~zw+=h06M}IP721+`*@lun9 zn;TQ2gL7aG+o-9}rjOyVi0^1N#+1=BBR3d(WLwtZ;;TL5-bl*DB}ocvnsxzPw0h-l#j}g| zSeD&Ta{bOsy6KR0xgZE9d2>~^fH~~4X_{wCJA0Qj3&>W0tZSgITvZK}cin4B`$s;X zN+~@K&24%4FqwB{D@s@t#ahn+QQiSWB9XRr`)!E-`>*3)0t^7b*Z7pu1yYFs0000< KMNUMnLSTXrEsya4 literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/exit_dark.png b/platform/icons/src/actions/exit_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f09dbd3019909fa0d235e4a9a41b46e2510c764b GIT binary patch literal 473 zcmV;~0Ve*5P)oGtI(xi!jAe0#KlceTooL(h;*`x&{d@!q_*iL=S!m{nA)Iy z@VLjj{D1e}y__PYgi%Zzlq{Fa-{DYtsZ>&8fXdF6%zGZWSqGBo)WuYxcM>5Q=X@^_;0pnrcR{Y^ zSNp#)rPN}K?PEBT*uvb&xe^tdra6V;;vn&_k11-IOy+RdzB1}_{uE#U73yrS(=JW; P00000NkvXXu0mjfNp97> literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/export@2x.png b/platform/icons/src/actions/export@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4f8466972dc8018842a66def14b7409795544a73 GIT binary patch literal 1007 zcmV7Kcyy@ zjldVpjys3`c&ovl?WPhsg_=bFSQpY|O1<}v$w@k90OOi(OD@rQlnfOpP)|7VzG z;9U`zcALNOro>fs=W`JUg`ij@8HOYSMPac(Dvm-X#KjF?_ixIZKp7aD_Wmth_HQ0! zk?aeLF-hgOe2LRjSOAGA`hatOY5nP)E3=BwYrcHTewjmX6hUy8vBC0qQ2{3pa4Zjk zHLckq@F_4cX{}dkV=k>bwWI(3;cKrlTfn~cBT0(A#lPf&9Mn;Mh++nmCs+P***%HxgitwCCl|QVCg<%t&8WyEv5=lWBAFb3wA79fXxQn7~$E%PK)#O{BRXV=XYLz-WNgj#-s0&*q3KCZ`Q9p=2TQ#%v_gxb^Pb{k~acmB_blkfL z8)3Ks*o{laJ|@@-Ts9_Utp1dd|A+~?j_n)=E d{{&tOFaX%MqNt1Q>9YU;002ovPDHLkV1g%U-Ln7y literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/filter_small@2x.png b/platform/icons/src/actions/filter_small@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..601bd31bfb7c09894bd8702db504599cc27dcabc GIT binary patch literal 801 zcmV++1K#|JP)1 zQ&cvlGIT)DE-)cf#KO=Zfk14i8|uJ76TH%;10!2uC64wibH4B1z59G7LI~K&P+*5cYj2o(xbg`v69eX5dw2Kz znXUpdnsQuG36KFX%LV65oCwW;uB)$yvg&OzAO*7IY7Sct6`(2PUN%c66hcl9LICID zGo|E#|C@yEf|(~D=dEh3u=)E>D#XLXI_%lE`~K#ys_|y_LU(2-&IH{ z^>y<0cGAlSt~`D(i*g?8q0le+^7XSutZf*KYSo3Dt`$)PY*&ONe}3bf5!(k^1eg>! z{zEReJrR=p#mz}0kr4&Maadh|gpMM#1R^AP>DH8y*a=&=3vFIx1}4@8-WO3z-PMBN-Z(>!kz@PMfMgDc z;f|LD$%eZFRJGNw853Y3xrwvKEc7n`xadd-#{7!R}w;yVE|)_Fg7=o5%r3{rYBP=Bdf|Wt2y%`Vw8&5)G3P6JG3kJdbTcwgcOsuVAX@a16GERsiM4*SLbi;*!mBj2R>zZ?{U$C9za; z1~b<==?z`~R`L=LW@UqJ#tvMN?E<3Qw!{2qbgvmh5onPR996&>(hjAB-zS9rB}cmi zT_sV_X^%hw(UFKMvuRfV+nUOVXbBM6wbeG!tDOvS&D7?!7BADK?ZOLa88Fg z?6|i}tMSLML-qkG%#&-b1IEKNvIZ!CrhNra(->EKwMuSzT>cVVy!ITvW|^M<%lI{#X8_D-rWKF1NzqQ9rrh0 z^RRO8v}`x5uwO_g}~V a1Q-BevmL!`&}+N^00000k8j`W zzkL3RQ!@`QHv>R@7w*aFdS z&Y=cY7A6!!z?%R3YuuD#*MO{+5mzjD&pgn;0yPArBxvT8nJ<&zy30?F)%Uw`t=WgI@r8jUIVrPLSahXduP}*dg|UO!-lbMRIYLo=Ega|9N?S6sAEnQ^rftTOMnkG zzHtu>`7+>RehHQi@%3LS>cB-UY@WU`QugCtUs?Oo{7yLY50fUwvHIB=qnhMei}mPV0L zB*=ckNm3DKxdeQ$Be_JVQ`jdsPqLjHV>sAN-=a9H(@^BvRHUbXM$nA8a(zwTsywA6 ztkUIVFsUv;+f3i8Jf*K;m9DXG(-78qM(zNDF`b=^uLF9wqJ$3B^%4y1o(g4gmLyc? zG##!>LW$h6gZOxtXH6-pNqM!w7dj)8;si?2KtM;_zp& zcV~9R>W>K=Dk~0S7ntj=!EBqzB#&nv&RCismZ?rPO5@jC8OJF)^fa^vfYXGi* z@>O+hVO#~A2D|`l0))bpy7tI&JTlU(R}Ovq$42uz;mm_qwQh}XZe60KBn%op zaU5F9ydUTwQ=4_@pt>sHX$MVjtkZiK14GrvQs3KvJS(zaQR~ zOVV!M#s9nxMXvwa+a7a2@q#Gmv&ur<9T?ia*1e zZlEm;<2B&TG)_TyEYABooD0@AY4~xC*$jY-mNI1Lv_6b1G}d}S)3&a z)j3Uv>yl6+w=6kg4$EW1fgkX9I1D5C0_v-i(bPrSg{e47Cb1IE_zBI6vN#wU79HRp zplz4K?eIPp@B68Xsi$|$k8N%Jd4}w3wOi>?2Plmr;(av-7+-chcRmPwNinKkPCzH7 z4nFebMat+((`$J@t;2Q36TV#eN`_v>9>u zv)H>ayJGcWf{u>so^d^I6=wU6OafT~Wg+j-A)fC`pez*QOh1gp9GD9Zs+FR-=zf2m b{}o^W?Lr64bVQRO00000NkvXXu0mjfezS_B literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/gc_dark.png b/platform/icons/src/actions/gc_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..498070c9101e9c691eefef7b1b2d817fae0cfb20 GIT binary patch literal 464 zcmV;>0WbcEP)KTB#&b~`h?|e)BOydBm(aJJh1av;!Y~Q3ebK{IsagicTDU!E zil_(Kd3FLZU!!w-Ng}(1C7_X|pvWK)@=zm8&;;$&3H}?u0t^82>BRHj$BMcD00001sL_t(|+N4oEPXa*@ojvY5TnGezfmlGSY_+hG(Ae2X&kr!6 zFcv~(!QZj*4_FeTCKwwl3?u}^aNHf-?m8nv&htnlyks*oZ{Ezly<<{JAhcR7h$1^E zN+qR$-~vYZ4vY5c_4+DTBfK6JIT;&FO9S7V!zk86%$A9=On>Zdp_%UO4eajj1qn1G z1%{;qMXHHk^b5`Crj-NB)~kl8IrCX~V}Fzkk&(bdj!%$~AD6CKnl&_Cg}|RzQGWTy zfvTpiOiSl>+C=L{gW;=rD1ai>3ts1>i#k{>=sQnuz89S1z)aJKmJo*FcT}-P-pBqK z=@J(pYVXz~_kY~rlyl*db#g#agyM7R1{Lg+zLxk65c_oc&htTTR6H?F?UpemD}?9; z{;V?0y*yyQ9s3)<929;I46_~Io%qK%ct4$ZM>wp+HAxPfNZuaryiz=jUFgIesE~}i z1g@MUT(_VM|HQflGJ#{8EMVI>kgx$1*b-j?3;>J;jS*r@R%e$00000P!L_t(|+N4uGOT$1IelN-8qc*5eP@#3Oj-6a}=wvB~n~Png zV+R)z2ir+pJNq-b_y-(|gNq6+-C9s7(lnPecjuio5@G_DK5)EW&pmlAxggFtB;oF& z!xdElMj4#l9wA5p3I*EjwjLd9OiG?vPb4o=9=|%3|ZgbmAU}%}Sh;k7RCwC#R!fK+MHv43HPby0-E4AL z2_};dBKih#q`gylBk&I4qLg znQUBkG(@vwPxnlBb(LS$RyH%eJDYBB+=~VOboXEX|J7IDUym__5R`7y)6=w3^KL&O zhIEa=mWSn?et&9>&mIzM!g$|%e-lO5AAw0v8}CWC%4 z3}-k2r&+7w@gD3HtOa{Ft~EbiMFJ>KtsONGx4Cnx#`OGOft|za1fJJ``6ixsGZBE! zS8T_6N!A&-HO7*Us8O4UcQr3*S(T*;D4+5hZ&|i^*|sgi09canQwig8tf@={3a)da zTyd#TbO6dJ3?d3T-HT#=hsEj((;S0vKB%bt)}+qZj(Mq6b`7soAk#Fd*NZ9eyT>z^ zpj0X@m8;%v%s>^_c5IR}@%`=vx3$OO+av*zA^-(Qyba~fmO#Ez^{9vm7^Xo^!Ilaw z4%=>P*MMWcW0|IqOI~V-Zz@+jDwkcnTj!0wGOU(EsJye7IaLr_C^#xt`cX=OzB8E# zEP69v@`Sw#S>qL{g&Y_pifZ*sTj zspOaXyr}Gjx414A`>*qg`I5~nkFQx0gfi+m197e9( z_XlBz@)Fnydr~JKT`1g`jbnBQlHN>9zmClyb`sn6SL7bo7*D}=6AOj`c?mL%e{X+YagoV>}`>(aF_zR59a?c_C{8~yaX}RCwCtmuqNTMHI*9?&I#OyLqjf zrgoe7AXN(5rc^@=R`bPH4ORQ05=9Xa6=^6Gk(kuynks@~1gVPPm&PJgDk(OfDq?7@ zg2rH*w$N%#q1m`}x4Yf|2cQ&%*d^S6(tzZk- z2v&j|xCH(HN5F6>UdWqt{|r0_9s%!x38MoKiswT@)HpZ|yvI|&a_x#>(BbmmV7I#5 zR(e-Vr`Dt+|Fm44nAnjFPo9Bo2u^%wvJ~HfXF#VOkg@}%rne*LnK#Ru?eFB~aKrauY?Hkrl1ZK6JH(C={v0=t5n@2_>% z*4de+v2u_N*-{@7`EnT-b+efRdUS@RuYZ`nyy339s}-wNVRULP0e_tD4T~p1dFEkocQ(+3a zgG;>&ws;#F9E@XaK{%dZ`@SDhHa6bKK6reawzH$1pE!R(*?r)UMYUSkyW1bqLXU3M zqREu<`47hwyP6?{V{{x*8TsrIjaITeyO@ zI**&R-+B{2Ja&qftYlZxVC>H2I1sSfRZA(lMOo$ZGWpr(bTFsQ#ucf}Ww)|?u{dK_ z(l8vqi*+E!3k6urn%FEB%&IoWNX0QBw{eY&TC^GLml6Y0g-oV6v&T!SeD1#2qu$u2 z4-BB8$y<9V4xGwei52uLHf!UvZQ1B$x)*+5jswGq$;nLl84x~{nSqi9 zw3ZVCL&-?wuWUTN&f)di4?MM9n{h&vS326bv2EMBW=>FBHj&6f;{s_dW(E?XcG4el zrM@vWJ|5?}9AD@TFhYH(FEn02C}6- z)R#2mtu5+FGY8I!`gX%C?M=sGpI#gty_}6F@(bMoWJ9*phx!_{uDNmL82AM|Ad=Ey zX%^@{@9kr$V-W6j*VL?C;rBaS)m5rZRjt_XypYQmGx2!-Y9x|PMWd8{^`qZmlO?~$ zm~$xl4-=&2K~%>71m&Htl${j@H*-k)Hy^rpe3Jk7F zTHWBvLMP!-5xo?#{S|PaUtGuUfDz+M<$wR{_+J4A04i#6e^kE~DgXcg07*qoM6N<$ Eg2dKT9RL6T literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/groupByMethod@2x_dark.png b/platform/icons/src/actions/groupByMethod@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..5349fed766c0ec7e3b5eeed45e6e9d032cf19c9a GIT binary patch literal 1259 zcmVq~btN9UIHCFA93W`QVRHUI$L}F5(YpMu}5u_?Y{uE20Qc0~LKNK-k zt)Ma3rY*EuQ)o6W-R*Aoy?e*+Y-W?m&F$vlLVq~$Wpd}9^UZf>&dfQhaL(DaY$kS% zo2B^Az`%e!{ygw1@CC5@KhE(1umcDH9~TEZJ3Fts0pdldveA08f_$I|Pu zSkY|-wg4M}l|Tl#2>bzj0}KVCxvbu|y}kWYbk7101MdP8dI9%~=fi?jKRHdj$5pd( z?TWfOo5OdV)$DMZ>0LgVSd$F>({yEGVn;kUc^b9>h&XDn6<+~Q10BVHlm#@4{wLkU zG)cGW@pSn&G-I|L4 z*^&?W5{EQLk=th^z$5yU6mW0UVA&P3Wzmz*im)i;3ywFzrOMoBZlhD6Zyip5O@qx- zQCRk_{fA6Xv~1!dXU?(Fzb_~zlfpKvSJw8z3c5o}%>`TBwY4_Jv9~}l8e{vu8&NjaU(eouY@4>Tt(E_L?!2=5z+sbW zHnDfMKcEF3*{X%(3FWizk10jJ0>|{REu9Mt+ImNImCB@SxxQ`{-`sd(VZi5d@`h?J zizJfDH3jLLiM%UTgZtH<3w`(&ZM0>fdh3m(*t!v~28cWAwS#X>u zuEnfCO!Rj8BU0+?Q{&@Np2_fqa)2J>L%!g64O|(STbgT*fRHXHkch!dJl=ot#EA&c zW%-=FE&;M7AMzy*`DlxN(n!D=(ch|DrM<~W& z+l?JH5-=gku}7(PLk-ujXE;7x*?uW-)z)r2{FI2V{qn`6zX#p|!oV)MYAHjj2VN2@ z6)1HPk+Pit6(jp7x0GRWRpRObE-!Qwek-DvBDSv#0{TQcrnnl>zf}JBzmESEU;to1 VcX-QM`QZQn002ovPDHLkV1hz;QpErO literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/groupByMethod_dark.png b/platform/icons/src/actions/groupByMethod_dark.png index 7893253dc397f4eac862287f25b7ab0241ad3b16..6cca6e8c21b5fd9eb77867e5ee672868f18c9564 100644 GIT binary patch delta 255 zcmVh=>3H002ovPDHLk FV1iI;YXSfO delta 253 zcmVKPCR0P(4ej0^@Qs2p4~5td3p)tbRwfNpcIi%s*N4kjoteo_+}N0bfsqj+`2WA;hx_;HfG%?!YhD0?Kv2qprZ9$*Lx-w> zR28byC$PK#%MXFbE;tD@gowNV(+twXz({F!1_&?!`KHVEXQ5X=00000NkvXXu0mjf DA}Vu@ diff --git a/platform/icons/src/actions/groupByTestProduction.png b/platform/icons/src/actions/groupByTestProduction.png index 3a16c53de2f456b7c066a6f3b6cd414d4d0eab22..8cb94075d3c2b5ecb83ec372d94ac7fc0034c874 100644 GIT binary patch delta 236 zcmVRb^rc-kV~XkusDx_NLPRX69a_+-31K3=l8=*F9YIFmhrdW0BI#4 z?g9x`T}nf7B{mm;#FhbZCzLM�^j}CW0;ig8e{jhbG1e#AT5{ERD@Jbl?oc>(Io0 zLdBekG2jmn2Lo{>l>Zj$gni-&KHbC`2 zTmTYKR8*8A!R1o-@81WxM2ZEA^B9P91sE_fPzcanz~Fm+Kg{$pApT?-fBOxPRs!NK zkYLrNG!$22a{)+f84!0u`658v02N~*=mH?v55#t8Vw^x631!66*la@w&Op2lP3$LB z%$XPi{s3_>5LZI^Z=qfYhRWgh!e&E9lt8Mw`B{}$8^L^`i>*u%k z_uH2DX9rJxdf&Zk&-?s)-{)O&I2=w&q@*MzSW@}K;czI|d%z@E2SdNyV*#`SCs^i- zE|*I)0`*`Fc)_RyCz%c(7y%8@Qjh}{!6)bg?-C4n1-+zm2^8uXFb;~qJh+jV>PvDg z7fc9ifGlIV3W7C@#Ui!X{C@u`hAz+o=D?jg0!?I)2b+J$u6F2Tso17HZK4R&(0EK^ zK(Y;Ha0og@R365gEX%GiaazTz9_6fNUDyjM^P_z;$PdYCtHq(*v{K z_q83@`nQm`J77dFC;%IZ&unh`t7g;+&Ow`Ejm^)1-ADtt*KQ4O+1e&yl5K#xwB!uMUJ(X7k^!tI-15bpDr-RhrnAQ5Fh8F6q7+=wSY}`|is-n?2%LaM zdX(-_|CTLvsyD|E19s>I+k#w8(_>Pmq=RPg1$IR#U~e=J$fLKLZ0Vr-+EBhZ)W>iN zJb^*wt3`qogJCK@r`|olEb9kpU8TJ4G literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/groupByTestProduction@2x_dark.png b/platform/icons/src/actions/groupByTestProduction@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..552bcec2fb94e33de785f9db92be04047be02b24 GIT binary patch literal 642 zcmV-|0)737P)Dt@G-6 zbKjep+-DX}{knJV>z#YXU+%F0x`7ug zD~oQoTh{|kU>ux+F#(5UIxfK|XiXG?0>q5+ETVx9r{G`^X&JMuu$oyW@ot~Bq5 zY(~!;TsMaA`@)`x8MUAU1XRD-T>7hG)CJCgQ?C}4V_=RpL zYZAAitVzhE5)LKVs@f~gfJZWb)r7FJc+g^x7~gcMwFNZZ^FnYkRAMSzq84<(=1=pJB}4T5a20&)epUePrKo)cX}dti<-c21)~NPhs~Nkl$73nCWFe{K+!@_8TCr1jJn+!On-JD6Yij0+84;kXk5T1bB!Wpkhn}T>u38K@LF^ z;{@VJAeP2v8#-_X;&o_ZKcQmI#2D}gh=YN+63TxI^+GUI4!;-Bqq6fMoSBC=7JwQV zh)Bjb4G4rLPht%KsSQL9gOgB!XC!C_>0w}`G&=(X7yzcDJ>Qz_L6rai002ovPDHLk FV1oS&W2gWC delta 292 zcmV+<0o(q+0^u38L9vD=#tFocKrD^THgw<&#Ou(+enQ2Zi80_05C;Qs zC6xab>V;sa9DXkxbq+=eq@E{mW***HsIIPNATlMwl0J$7fxy)D4A}rYc>$Im0+GYu qBvgQylnB!d(jCLVNNIKk2rvLD6-DNgCNMn!0000kh!3h3>_H8s2Njf3tl*)di1p$@K?{}S98cCmE>fsBd(cBq7NiFQ_F@q{_(V_- z)p$|RhP2WA`*1c*N)%0+NB@F!V3^%ucjwFOw=;i;loD1`v|2apNk)@sf~cb}EtpQMwYoCk(p*Cr#0LZhOFpWCQnL7q z@g$4R?zY6aGUkN9C(;-hy&%a^X?Ig>U0u8bXN(U;x<3= z`pncq%_NM+;}sWAL}vWRfhpv~fxicb8En%>Prm7zt8`8xk@#mXkQMX^9(?iO`)xNV zBOfFZuUwVy(7Wv;YK>Z3<*d4zQ5S0Oh6P`!b9Qsw#UNb@uEw3STVidw7S#`Wi)&Y; z8>)`i*Pd-{?MR2OQz5@7-J1>%w`T*Y7xWd^tY{@v0qk%lc;EiahE+;8WrAL`{j~;P z4uFake(U#*<2#a~7-%uf0rtIh1AnJltv-VA1XP0xfOdvC zko)kf02*U#A6Us`GOPZ@7()#>7>)~gk73JZv)3>z0rRC&>BEi1V0Zy)5c^S_`gejI z4uKd@8H$~`u_J%}uM?o+QHVlnB@6-PA-b}BR)jdgdSW6@}|Fe-QC z3EZaHkw^r4L4TUfX02Q<3xNeH+czOmVkaV_xT~Ps?fM&gPRNRk1?-;Qt4~`Cw~C-H zqHbD!&E(e3=IOHGTtSl9u{y47DdCV)RquupoX?OJeXrp>PG?C(o=kk}##Xzfcd=d0 zE69qJl*1AcC|N?#pP*AV^kNP{->=JxxZyRCGJ#lTpJ%i>I!^8Im_is8JNbP66$2NA zyAJ5;uud8M{s(X$jT$AJ7s)`_r%z0;{XK3xV k?tR(6^uTBQuYCzH00KhnV=|eSrvLx|07*qoM6N<$g7%2*+yDRo delta 489 zcmVoL_t(|+Kf_9O9DX@pPkv&wG}edK0qC#PY`|t50TyU7=nR@ zP$^k?lmf|vdg+v1q9Ewft&38ZuJsjyKoIiJwzKQ@-mh)l@1KCUXq95NZGg=iJDt)qiR)K)eEK^AZ48M-6D7 zrxKts#tML~OePa^AI2DRfaA%yfcKcRY&LrbO9Zf9E|)*;SO}IkKoerWl2dmjsBi)Z z0jd+Rx*a=p>!&(E%jI$nSmJBK=kxCvxGFyOfmbGZ z%INqXzK@i9HcK6`m(8f~| zU%~hU#z&wqYG|ai!GstRj0yNfLL&*W0UEor)5OBY$_Ap1tv-SYgpRud?t^pYa-0a9 zagtwlcK)-oyR%DN*Cj}~Tz&!eCi5^b2XiNLN_?Y~7J+)DQduP-2AYC7Kq*)^af-#_ z8)NJpXoM92t%*61`#M*^PbdMq)oOKbb}`0K1J0)70^VcVYPH$}4BNnFKA-RUF$IPX zparpC#p&!$obz))0qRq+rXRbQ&7V5~TBFfWVK@Nx{m?ydm(6A~a~m#d7VLD{>2wbK zg`Opo$;(B#3s2xT%~ccydqH}=UaL?j2%!b)$Bz*%vMOg3cNNB>)ppjqDLE0x0Yu^G409)zsjG8`Ea{vGU07*qoM6N<$g3#abWdHyG literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/menu-find@2x.png b/platform/icons/src/actions/menu-find@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..de19d8fdb4a219bf4e41551a9440706298dcf102 GIT binary patch literal 930 zcmV;T16}-yP)D%r9i;N=Z#>9 z)|cXq_azEuc8TxXz`cs@`?Y8{gIY~-QsNl63trh;AjYS2gi@p$8}9<$_jFCcCNaJr3!mXMY+~Oo0^`A0P!5iR7K#^qOA2ihYmggC zZ4{tX3TnS8mG-bH4}fCu!~o4Z%I0qX55yj8Z4{^!W2bSVZ)oRpuz5)dsKOj_+hH*_ z&n5`V#Mn)4r-D|?6f6;Qm9~bb1&YMjOKvCRPy?uL4C3tQ6}2JgWdWHHDQ+K{CL1IT zH}oMjdpy?9==>NWu4@(_-@;_B~0B7)#h>!6i_y^-Tg>x$hAe!8e|pq}WxxP z7Onw`H)>~7 zx3POVc=M(FG71UHbg=SPw;?SWW|KLSC+^7Hr_l z&GSiifeT8V(0m48JhU;Hy-%c?lpor)9_BVf3Db+Ho-Zd;^arzSp5oY%0UPE6_-x;V zSHW~}#m#gExdSeW2aQysL07`-Rs4c2QOfsv1(>Kk%iFp5H1k`bl^5@HsRc^ZhzK1l zV0p4up#F{MF_CmO@AnwUNBrtP%TECY0A$DF#IHeD{r~^~07*qoM6N<$ Eg4`#x@&Et; literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/menu-open.png b/platform/icons/src/actions/menu-open.png index 44df1495985de6cdc12bd9885b878b3e39a1d6d8..996b47dba167b00d3d78774c640bdf44f802f916 100644 GIT binary patch delta 289 zcmV++0p9-T0^tIXNq+-LL_t(|+N_hoP69CyhW~aK!)C#K9nZdl5W?L@;AVn}diCak z7cc}K!J`MC2ja42J2RGINUITd1CumqIy2wQ{F5pX!6~NB0$AP+BuP}{V8^vJPlr#7 z`+os%&tu6l9XW^uhg>>ir0uCDFj z{ylIUVeO& nyFzIqFqY5wnHo;9F98MsW7CgYyITM;00000NkvXXu0mjfjKqcd delta 296 zcmV+@0oVTF0_XyeNq-7SL_t(|+Qd^qPQx$|96L@`l$KOTt@;$s{DC6GohNWAq8#7} zJ@5fkwa?(ddq8Sq;@!o`p|wE@iF#nA^})M49?#fHL~u-K92ursHup105)~EL6LTdm zuAbMAe=-=IrI<{6QI01m@{w7r=a&yn0IJg9ZFwWvz(fUMz<*l8=ZC{~OCXB1A_8Vl z8&yv+vrqbkp7wxYu5ps78ZeCAjt&|yG0HFC{PtC~5$^rvT9{M-;2GGWy`8ooKO-SP zwb9Y%L_t(|+G70w|33pIfN^jcke{EAEY}aj#X$TINera8apJ^@ z4KM*FJcbtl@oFIE#ODGg0xk>!;=MpDLaYJ*kuVHc0`X#82C$%q37TObZ~}MzL_t(|+G70w|33pIfQf-ZK(PTV$egICC}eIw5EldSKO`}b ze;b!ATh>5~3kraEH4t-B;)Ng}-V4Mc#2WA)3B!OT5HBVw41jz)U=h00000 LNkvXXu0mjfNijSX diff --git a/platform/icons/src/actions/minimize@2x.png b/platform/icons/src/actions/minimize@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0295873eb40ccc651347117db4d89ae75da69dfa GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GS3O-ELn>}1{rUgj{;&g+S{ozVVm^sd25!C1KYwasg8n+h z@ErNiF@yJXT(3gXqa&TXSGXFP6ykV~%wd*fb#&Mx-r>q-#2dl%(NG~w@`TF@uF{sH z4$qhZ74ESgX}nT)pk78o`az4@nLUj<>=GYSvnQQqT+#UBley6k#v_Ifd#26eQxMz3 zm{gyUl(Jwu^E;-E>H_!WI${c#qQvgVbrdDo3Rp9KeBG$Qsm@fWAyB_OGuLB*(W2T? zo;7wSjRgEn?QSVal`?$$RJSGF}1{rUgj{;&g+S{ozVVm^sd25!Ah&ERDZCcR>R zl%(*_{XkB{w=5PxOG``MD_o6C3URzg<}gdLIy&qT?{H-^;*DVXXs8e-dBSA{S82;p zhi6QI3isHLG+rq?P%k4P{h&qd%$`Oac8QOv*^^E)u4w%6$=v7%;}JuLJ=13KDTwW1 zOsdaFN?EX-`5n_nb%FbG9Wez=QDS%GI*Jl(1*{oAzHZduRA(yG5U5|Cnd`B@NGf+i rk5$4Ci-y82=_aol1m80>FfcQ`=~S29e+|CNBMtpzIum~hDr1VSnc|3YtzyJiEu6{1-oD!M<@bn?E delta 83 zcmcb@c!hC7qDblMYl_9c8+S-_{8#L3{Bv7EMC8iEQf(7PkyU;Ue`d)rt1%Ty2-K@v nNo_oGNWi1B$JySPkwt=`V83Kv-@Nvp3_#%N>gTe~DWM4fqaz=0 diff --git a/platform/icons/src/actions/module@2x.png b/platform/icons/src/actions/module@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8efd632f58e0773d7a41bc9b2cbcc384b57d1a89 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1Gb39!fLn>}1{rUgj{;&g+S{ozVV!nh%!*9O+YNm!JjD>$4 z+8ksB%=t=0t~fd;Ib3$oRqb04ro>|T$iB0}M4E3?5d(L^l1;Jy-4`dESjsr*pxD8X zIYoBw)00C_JGq|^yJW-iVQHDp!pnBEINW6oUdTFR{rx9D<@f)>zif+?FE6z+u2}!NsCKe0xbR(47pPu6{1-oD!M<=SzPe{#wvP{ONcm)u%600~I zh>rlV7?jTl!z{>dLIP$$ybg$MK%9vaCqg_3)rIb%(?A?Vj5AgNu{99CLYH8qS)`Dp b7$Cp^h+h%{b@n5y00000NkvXXu0mjfh1xMS delta 124 zcmV-?0E7R#0loo{Np)aJL_t(|+G70w|33q8*7O@pT z%u1}{a3DSc#9}ai!7vN5n~;DR5U&Gb8xUvNvSn}&GNLI2X+90aLBu#?6%bnk@hghL enRbc+0t^5w+#Ck4jTCzT00008U}fi7AzZCsS>JispK{IEGZ*O8WEvzdf@q!{ZeP4GuVUKKt{hMxga-st=C| zQ%_}O<&;^D@#4bCA4(L`mbM<0bl4-?(YhknfWw0MBd5Z(17iL+3^Y&rigxrf7P1Ju zZ{qZuVNp+jbg&0XMI42GI+ZBxvX8U}fi7AzZCsS>Jih4a=978H@CH?vT-=0~QL72Jszy;$Osi&rBPMP(w-lRv< ztinoQ^QA)%cogpO9dX*i!IiFH$9P04;)%q@#GpeFq8Khu{qtu~W_DD#$92SV ziA@E-9SVGc4U4?J0mqNTn6~vzopr0FzQrUH||9 literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/move-to-button-top_dark.png b/platform/icons/src/actions/move-to-button-top_dark.png index 640a806015bb93899cedb896adffd29f14e4566c..691ac1feb1abd2c393b8eeacb0284c6d10258f6c 100644 GIT binary patch delta 100 zcmV-q0Gt1|0lNW^Nf%v7L_t(|+G70w|33q&VLP2&D5-q>!W-Aix0T2ND9!Qo`~80000?i(^Q|t)xHy|JyTfZ0KxcIj|}3uGPc@N!zAfoRZBAk^;#UZLF)f z?>aAUwCIpXU&EA?tx(shchFgTe~DWM4fHbx@n diff --git a/platform/icons/src/actions/move-to-button.png b/platform/icons/src/actions/move-to-button.png index 20cab7b151ae729b5e4a920d44bc72e9c3ae5f9b..57a187e206e7984b5d124b4e988eda8a5b103773 100644 GIT binary patch delta 169 zcmdnSxRY^$L_G%^0|P_Shb7HGO0vW?q9iy!t)x7$D3!r6B|j-u!8128JvAsbF{QHb zWU38NQM9LvV@SoVq(A@v+cR%$=xk&;FlqjLe~+{En|zKft6&w_EVSA}rlX%>qr{Z+ z9EWvIw*s$U9<)X>kWPw6@o-U3d9MQ=M2N<5R zCS-kOQb;^d@SkZyR$@RDSr z1<%~X^wgl##FWaylc_d9MKe8J978H@CH?vT-=0~Q;qe6H8LdKRfByWbz_t4H42cYu zhy~k%WG|dKdPKrTwj(k#v4Bk=pFK%2ilx<9U_L_|TxR}%mL literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/move-to-button@2x_dark.png b/platform/icons/src/actions/move-to-button@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..3b00c13dfd0d483e8c3c149f983c44d1eb60f20a GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8gy!3HEdYt9+~DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MID|ljv*DdlK%YvZ_ljD@c4pp#iu7Hr_5@+n(D)2!gToZ zgO?6xyttc<8!D^?xGySc%xV0=B9NWn9eKk*GjR>qk>d?FdLzXDt2az+R1nB#eIygL zw5z^FWP`)umK$@v%5@xWtS~oZ6Xwoi+^9cgS=1_qofn!SoI6b`qy(xRn-eXjAKzjm cp>Tkq<*)Whh0H~XKsPaXy85}Sb4q9e0QIF*ssI20 literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/moveDown.png b/platform/icons/src/actions/moveDown.png index e539601c03eaffa0d4f07f7149d586b9a376aee2..0b398dd7e8fac4a58c6a7c003be5ff5c44de3301 100644 GIT binary patch delta 283 zcmV+$0p$ML0^0(RNq_xGL_t(|+MJQiY63A7g>U{wtM!SxD>^OWqR$~nOZUYq-HRgl z99@)B$DzAEQL&);GfA64>lA_q0*7$FoaBU9YvCO6y3N62Z5buOYh&Sc)FVk?`|<)B z4H5iyE7KEs#vp6{fZCdLP-_cH+sY?{N}I5vPfs)^tmx}R{C{^`J-;C1bW8{VkqKyb zT9EygvvcKazP>^3B=}ja%;fXw4oUpS-mE|&_}Co)j5DB=hJEAHmG%HgsV3`(9IM2r z{_+F4gMIR${ETwY+wdBXu6n53MR^2A=zY}1lQ;fVJ}&|sT6IuypJQz~b?Q!6VYqy} h!GBvlM|%MV02FfehW)UkP~`vs002ovPDHLkV1le0j5h!P delta 282 zcmV+#0p(vH2mz4@ zsMhZwIWOnvmhp2->s3LMh~D(+&ml&oZK8>{`apx7`}e_(Xa!}W)zLCz1!=#xH%fQc{mwZ z*;v40zkmG!YW&Xd?dy+*-Nl}b7#f|rw$^h2ZQ|mFXkuh!1b>Tzs3PCQh*PkTt;oOf$&YKm!^Ml>0Vf4V>TwNB=W1F@f3t{{3TEn_$g|u7(9$ zQ2+Y*8)!2t)Q`WhMi*9%zkmN>U}9#5vx(OD@9%#g{s(6huMy}k5Qedd*2wVhKg0ij j|KV(s(kdYU5EftnzNd|@TOYgz00000NkvXXu0mjfI){+x delta 260 zcmV+f0sH>l0>uK5Nq^@_L_t(|+MJS6io!4uhNo$5(t;=27ZF_4S1;fVJVNWE3nJdY z3-~1NF1~vwZFI)`5ehCT8w~vLGyi-{m?RMqdgrLFV6yqGpsqX#O`L8|l`(k@f4MaE z_u_N;@5Hg2Qj~dJ_6aJ2rZbfIfq7)rCu3m!FOL49!eb#zefAWccC=+5E= zj~X)cynut%p)#fRkjfOX0AeqA)R3VEy`9UM?ardq^D^w<{rn^O+mnS>-CQm8@}Bp$ zvBBpEg4W(hrD^M}=kQkYvG4Z2m5u(Uq<%f+0B00RI_2Wy%VLgqvO0000< KMNUMnLSTaIwSlw% diff --git a/platform/icons/src/actions/new@2x.png b/platform/icons/src/actions/new@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..62a01ac8bd1d9faeb19336c6164822236db77f78 GIT binary patch literal 731 zcmV<10wn#3P)5V$tKTlwwto7Vj)f0ONM>qy~#K4&6}BTHbN;y?G#CEmfV5df!u-If!u-I0X?nZ zi{l6W``&h(6a4U8cVtBzSW2QOx{il|F|wj5uq^8tZhO92=X7+)S{UvPgJ2KldP`)^ z!sdBq4oFRVh%i4W6bfG*$2r0}6~~tl0V9rM4fCsYryS=HFq6POg3Xh}UZnjZYOVp^ zI0%9*LI|FZW6w^kH#gpupf6)Rz-RFq^G%tuz%Yy=AI=B(zTcl5&VuR~sMp_gB^9k6OnHC`zoNe1fxM4T1dk1@H zeg7KLO^pmkr*%8KXajWh+EA(s*vrj@nc4wV^GVaPMyu7T?|I%Ggu0LQeDhXWyS;NU z9l+kIdR`T_W7y-ATxJ*L#HXWi^u#Ppy{{}>TZma;huJ1m z7NE%-#KyZ9nvkN>Xt_RG1uWSC?6GDhWYP!1Fub4e98{Y~(vgH6x{ur^8rXZ8(h!w= z8r8iO2Ytuwj&dW?b^XR-h;@A!x?RZqVQ$yV1lSZab0ChQA~w9hG(>1$)pIT7T}{(! zQpyPPn~i4mn%gz7=U{Ut)Bl2h33&dNJ1NW{U%MMxYtNPHwt5<#5&4ZR7@4k|>1i{9KEgq!r^Mo`>1kd&5g*E5@0nY0^~ zcA8%HO@7JD>^n2hyYtS6Vi*Rgq^YFB<_K^EI0762jsQnMRk0o4=f(=Ti~~0~EQ^4D z*gB{#BtXUzoPrsfaeF|wO_0+dEK|T92!RJM#M>5m^c1Y}wgGSl_QA2$St<5Kl#>H& zU_UQMK|S#C`V)8ookG1y_AZzg%I(7B%sj&6%ofU#gy-PeoCqQ5ZFNNVx`>iBi2D3R zXf#Pk*7S>mGucVV##jQ4tfB`nd8W1xy-g7s|FC@Dzy|Llbrw zW-W*C+ap4KNA@Z`7*9%hVzw+MR|z|QQ5u`FKWsNi`NMsr`5kLQ~Lj#kHwBY!frfVcv_FTuO>=RPkS z&Nl>{u1^{_D{35cu4G662oMw_uv*BTSUO^MlC4rfjbG4HX%4M90iq?1{@PwCso-FA z2oiunK&T@an9eh@$2@uB+>9B5)<2bu5 zuKU%^X1k=6KYwYp3*~Q_Gk=o&_9Ngm;g*&6%jGTGwgYS|Q&RqoqDUb0#}mLb05HZ* zD7d4)O?33O!OicIxVbC^hMU532_{aoPR$#b{hBg<>}v;};y@6xr56;*pS*+p#bIM{ z4yBS0QiV8`WX_AI7v29qT!m8qsk#Bs4N^|JC-D5@!)h1}*eM3NRtH=+le|K$qnRMk zznEbwl#zn|o!<&7hwQY;3}R@p?$1>H4sZ&4*vM_{MFGnxV)H&>%n&yIJ5FWHZZ>=R nsH!KMWzW0DE$J4W-3u@PXAcb4Mo<^c00000NkvXXu0mjfeYWd@ delta 498 zcmV4L6gxYyvbe~d zh@Hj#0aqz1qJ@RkapFG^6)hFPPGco_aG+R*G@=0|{@CoUyEEf^(ZnogE`Wk4dy7j|a9 z&i@a9kp?HfCzTcFp@fnEo+se(A%IdzfDmD=gaAk{@3L~0loCVygKk6sniCqB7AphR z4#yGi8b~3*e+C$w*{lk2I67RHcFTB&l7f}@XcY#YD;g?pn&vN>X)o4HS4AZHz8`#8 z6pcprVwUyIihsvDUDy3VvwmFs&X4cXH7x}7ZPN9vl5J-==MDO0=W&EH~$0T81|tZS*a^kC=S03>ikZ)w&bZdIL} z!#HDCutp~m?W@yUlZt5_5lusw&#`)cW91&83;QVKCTfwzc5*0Q7uF0*Atuq4G2X~~ o+Ek;-hW+%E$5)CBeR~mL0C*tXC&$8I#Q*>R07*qoM6N<$f}r)~5dZ)H diff --git a/platform/icons/src/actions/newFolder@2x.png b/platform/icons/src/actions/newFolder@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8cc233aedcdd0e8e42fa29d64caf758b4107c06e GIT binary patch literal 1199 zcmV;g1W@~lP)cW<8nh2qSs9*)58wE>5#f^_eMSLvVbY-`~WCpC$_}`xxs$WGHR+#G^Aiz z4y;$KNzd^Jf|$Hx0IH^dZfNN&fT=6VA`k*lX6(4<`atQ{K#-URWirW_v!uxaT;OI&Nl_)}>(`^PZHW+~Ytp)~%>`8ebkinOR1va* zj_y-aTflYP4gew$Tk;~tgB11D?&}nU2p`jnHcP&PcHot>P4nMAJ;EAwCAgsa4fmzb zb3DPP-gh^90+{)FylLKlxKQUAu4m@ZcrpOb^I@&D4vy`06rM|A0o^d3;Sb9+r(>BK zrg}}6)xiR^9)w{KfNeWqnN9)#xhH@y4Bx{C|8P2%$ylVWNE!XA9RNl!t3`2j43H)% zG)?6!SQ(bp$9wmpg`6>uz>>+3;H{yF-OeM4Gy#=_QW$ZA0tcZe*)I`*b= zDvD=N`DsN_{xb~Y@tUkx(E>81RK)So=)1*W%AHv`XwH@12n}+nD-Uca>umz=V^sdW z=Xv+}zJEbg)xU!v$j0k9eiPqKcvmX>xlCD8iZ}Ciad4?M4f)C9)5YVIydcZ+i>UnP zh@M?{Z&Sv2UI8D4`h1vtgxR$(&T^^M1sh|QE(oxhrg;%h`6nvhPXq!Zj|{`mo_=5f zgIn_^T>qsQ$x|}w{PK`X2)^#Xgd6^4@m~rH@PI?Wuc4`j_-}QEa3vcCa z2}fm3`&|^pQ^{%A+XF&G*IOwdtWNc$n*~@>dH#2#g1@}OWdX>kf|)I7w)j-w`uWwX zl?@lv+RBx3HCR<;nW^Nng`u@`yROkc5~*0gtB$HjUCSe1LWrX@WTQ(1mGAF&2RWkr z;;$>w`tY7?bjH=W3M^i(z9WQ`ujNY@FeY}jSHp&SEK33mWHS&_t?P{_45~#-D@lKa zj{jurzU!BYQEw|^j{88Nl-s>9P+I7m1+jBP0*Wa0xRO;t_?~!PnKJhM)XaVZPriop2cx^B2`90b9BjK2wzeNXcp_1G@RQw`4bLJQeu-?jfQ0lia>5U~ zuD@$}?m3;-kXyrs^5e8>O* N002ovPDHLkV1heDK5hU2 literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/newFolder@2x_dark.png b/platform/icons/src/actions/newFolder@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b637f364ceb69eebb4f4ca294da8c781a4c652ed GIT binary patch literal 1095 zcmV-N1i1T&P)w z`Ni}IXb}};Ih;WlWnh|Cr&%{&4`%^PU8P0_LI9GCT{H?setSwJh+7AGZtQ2VcqH_P{JTQF2&rTSl4BV#3IxUb#)D!bwEKdB5b0xj(TO`(A?uHISA72F=0WDwRmKI*JKUE=p5tYFy7pbscQ5&T zcSQo`=Gb_h;d+usc9$n$7)2QSm4P9G|_x%Jgf|-b7XAKZCDIN(WcS@REoA~ECOtJri`JatM ze3WkRbwehC&;{5QVSy+SuJ|_M8)BQdcU+uaMx5j~8i(oC6}`FkIm6b8G1YqMCm`wo zo1mBmqD1)Vzam-?PZ52HbDrm?5bs+Pb?aGl>99l53yFeEUL0k11KA$f4T@+P0ehM!{Fp6~C5o_<`T zNHD7|0v6RPPDGaJG_3_Gtxsjr4slG7`!Y8CJ|j!FWE+~E>p#B-%mdEPc8*Lym6b_G zGKWObkRL8j#14&jJxn!pOB4fct}uH7Ume2=1Q2BCPZsp|~Bd=*+y1CsqlvX2dFBkGyl;hha8B!3D z&i!b5o*h6OM(mmx15=lvNrb15P)Qj`G_oYyQr_+K+rnG>A-dmEd@{ZuTF2et)N1`&MGa6`# zDEfoNwoD5?)@E8Y5GY_X2PQVk60OM*W-n7IK`{WV)dkAHvRE%gKcT@iEMUxDZ@1Cq z92{o<7j%OxAw$R}&0{rtdHh)v+HE9(5Gx}Wh(Se1UJxJ(8b>Oq-X#D002ovPDHLk FV1mx++*<$u literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/new_dark.png b/platform/icons/src/actions/new_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1d9b4ca7ec47e28507cd50211bf6fba3a1b50ec0 GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X_IkQFhE&{2`t$$4J+o>mb8<eQhV3`Q)km?r!vabinh+NgAb_00ChY5#um z7cnwlu~zu#le8y+caz|g9EE2sS{Zmn7A<64#(Cub!V(h^VbP9z9&cs_?6+?@ e#>4E;z{pT5U@+AC%e>!%SY1dB6PMo0o)2Dam#=E6>FWm*SNCS9?Mux-wG}q41m}!wv>P^j-)tiNjB&0mkpm=W;Lb z16d7b6aeQ6L`Bzt0=Ax`H^Lx#%Q>IInb)NNm~HChDs%(n*J@}2y(5V2GN_=n*ctlr z<-EWD{Aq9HSz&-$-6PCl#gYb~2IN;tBn^p(gakxgAKJ1V&OLAMYfRO?P8R|&nFRp5 zaNLw@E;3OAgars!Z$(0dA6kVKP;w@cR{p?XR^)p2r3wD|X$b(iNzw{!T?%>j==$e)5l z5WLo z?r=xF8dV@(aly|-LG(*G2Ly_gs9uWu)pKnZ-7YzqL)E(o=aJv`3FIeGVxu5c1n9el z?7k5Z??-VQUx#xUw1ckmf853vDJy|`7sQ=wohT;SIYwDw3zz;XhV00NP>-FcL#qB+ yK~K;07Dzy?%(r20t^5RwvEXJ#9eRz0000$@}X>g+JS>Jm(u{Bq13eeqyP$CBy=KN%Wq%6c5$T3gK#bX z4_*zC< P00000NkvXXu0mjf$SH#t literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/popFrame.png b/platform/icons/src/actions/popFrame.png index 89f2fbedf29119dadacb32da9b50525473e8773d..69d8f9e2bfe99e15e0e2f38fcd14112d92c95c40 100644 GIT binary patch delta 343 zcmV-d0jU0*1D6AkNq;#>L_t(|+G70w|33pIfQf-Zz!(`BiOeU)IgHDeErWAduqnW! z`9C%{kHiKdau~dU zYQ`IYAmVV43z%cOZVv+^u5^H`Xn&wnITI6e0Z_XrQ2q1&e}DfqJ8sxFi>P$4KhU|{ zas9pyel>LoE@2^N0W}R7pyrwT0-R!qGJu(xx!_WDE`ve)6b2z(12BEDG8-gbNt6Lh zOiZG`UcY3xJ)wm`Ij550_QY0(-)~-l#3hL`;Q#-BuUQ3!8B_~u7;g47FsSBNGq4GX z0>%HoAj*J0e^CBR(C?hiaK0p+;oXHZKst>idzyR7?bPyeKEII%H002ovPDHLkV1lq0mstP+ delta 348 zcmV-i0i*tx1DpepNq;^`L_t(|+G70w|33pIfH5*M5}8koX^hL3ErWAduqnW!8N&i5 zAZ7#N%}A0UdM{L*AOIQg3y8yk_#{;9G7twr#fdTi1ik^W4-jt$VlN>6NNgY?hrt`D zX1oCiA`S<+fH}77_AoHwibiBb`vaZInV6UhfZ9cY>YxAr`+u+5al^h@$X>t+_6Itb zJFef?!LOz+!6hujETE<#1JpcoUw~5#Q3fzGGZ$Q{&SfxYpTZ!dYXGJ%R%V05D~U3I ziHS+{*Xx%IwURH}vt6KRYEjuuCGjMa-7`Dc`DV`SOv~xI4vk#ge}I1iARdob>#d^V5{X1z10EW@ z=w1>0<$HfSgALEXHo$$8TCbw7)ZMic;2O$O9lIRL4Lbo;lnBbl8a4%#m}z4h09%_V zz2N=#As3~Q zo=iS%IlyALD|TXdG)V-3TVKcmp#(UtTmtOfs-i;6**;K9vR;^Y80pUBr!A|2g+Qkp zqkcpMk@Ey&;Pyw2rmbtbA?%*%*fT1Moak~rUI?6N{*!4~{}U4FnB$PMY5jHDh`hD8 zpPf5=e^t&j+qa$z8+&Hsa5;}Cl5`ax-Lwcm?Bgi~c8aUBQ%1_$&PU48<7(@Tz_^Lqp*18-&$Na%az+ZtvMWLcO;PK#}EnD$ov&=fM-c z03LMsb$Sw3($9AsGCj)#)3d8mk~5Y8l#0?F1h{g1aJZ?x|01lU60n@w{T2LW>Z#$h zJrXxyJ|`!(WJ$VbX(L(+`G&lgM<-c@El)kGX>)Ag5=#escrqUC%H&g)x8i)rHz7n{r7W@nzqnY#T<4{?jdjK*xBV_%Rz^gb}eH6f{kpk!9sp_uM=ChS7ok dZ}?My0RUd9L@vmj(1rj2002ovPDHLkV1gl9ZT0{F literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/popFrame@2x_dark.png b/platform/icons/src/actions/popFrame@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a721b06f891908a8f73c73702bf67fa3bfef666c GIT binary patch literal 804 zcmV+<1Ka$GP)7`; zQ*xUpB+POA8MBBOdQsQ38C})xcTT_GbPS*n4a5bvYgBZ*k5iWj2w~dMIjE8ha;dbX zl%%1~?Bb;D0P{T;;-?3P(?k%sjeHIWCBSjzD};SpQ#EMpihw37Mse&(tRuTPWm^v9 zL+w6X^;0T{oIe}~U$Dk ztxjYHP~FzG-8-ya!v7ZluKY7<8(3NIi(Ua=q#xF@>771vTIsVkLVdIiKvk4ED$q8L z=fU4|75wOMb?POoOupE0$m}c<%+8*wtYmEikW1171h{dkf6&{~dkt1HDOk?z*8ZjO z=cdz^Si*$)k{Oj}*hgJE9Gz^&a%M(dhdW{Y>{TF36HU1p5P>%N^J6>)=;Ym*5f>Vir)-kO69*xi7#ehA0D=nVAbNRp&Aov`=9W z(lr3n7b~+t;*~@hz{JEP`s?*ehT9Wb7?g7=8E#K(W%&K(6-Zo?CE$O0$s6|nVH%3-~WFMb{|hM;_>=_XhLFy z8|n7v(&w+AzxgnJ|Gf9-_g|z1A`EyjT>bU`C&Su9|CHVln?{+iMD#R!rhEH{bpbAW prbGRS3llVeXaJ7|asfbq0RZ^TV$5exeEk3b002ovPDHLkV1jH$L9YM+ delta 133 zcmV;00DAwW1ET|wNdZNXO5l00dSP#g*Gt#_osK~LYnhpuUH|?6$6)vI6eBTV05{U@ z&!x{_KY#OK{Qi0G&+orT3q%<3Vz~P2|4)XshyE$OBQ}jPVTtHz_DuKo5$gh6_DqK+ n7F?L10Yn2vSav2C00bBS+=5~9y;NX~00000NkvXXu0mjfde=bD diff --git a/platform/icons/src/actions/prevfile@2x.png b/platform/icons/src/actions/prevfile@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..662e95f7d611ce1a249aec503a2551c1140ddb1c GIT binary patch literal 819 zcmV-31I+x1P)mu z>;T{rYvm&xya9|Kvnd7N45&)zJ6Z->*Ge8JAP*c;lDYs{`IS0Q;AQS?WpKj*t z0MNoeg8<$d+{$NAInUS-24c^dDQE6pE;vpNW8JdZR3__y?btvJitj>@=zpmu$N(xR zQc7P~wv}^GIrh;;(Tasox>r*42k=T9Zu?*2-$-Hrg?leAnWi?01nfHD(kLf=N<699-Z;pSp#+2+<&q&U!9R@0Y;Bx$Ww{N~!ZXNbCl zvKvKv3NrLAsMq}s%VK9S_;gvE8aCO^{roWAHgtDfP+9(o*=)`*j18R1$D>+=BC%y7 z0q}M`keF_HmVd<@P_PVH3yC=$MK#s|_m>y-eOqo!0AUz{@-To@6hz-o!SWKke(N z?&n~^1OX@OThH-8@?$5`lx{Iu(Xr5M3z(2E7GV1wNR>JTq}R=;&&5Qa3yUKf xsyZ$vWRzq1Jf!Y`$zM$V0~jp`|7QCwzyJVhsDo3!kuv}Q002ovPDHLkV1m*0Xz&04 literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/preview.png b/platform/icons/src/actions/preview.png index 9c0b3c26a9de9fc3a5c7179fbc1020eef80028d1..c84386e35792dbcfe17ae848a7274ee302322264 100644 GIT binary patch delta 520 zcmV+j0{8vH1jYoANq^``L_t(|+LV(`OB+!XhGzzo(1|JOqKO)#Zt6m`&~CePrT&0m z_eHW2yNDlIm1*S5;WWqlZ@y2e1Cqyo0yo2Iw8xOpdH2w zg+hY1p7K2E_xtz5;qY3iRGQ@dw`-&7buqd)MSKf>IBmO~ zY0v>npu<=+8tsb3V$JBwKp^mySWs2fT&-5y!~Ul2z;Zj70I@v2-P9{pa>}LBNu8g{ zGiC7g@x~smW`A(f%x`bJGY|*;@CWAMBluz8)=!a0APl7gchtmL6>3O#ZsTS^8#(ff#Gs+YX&PY1jFz}l7S?3*cm`p#%`R{Us9p#hqEPvB~M|Dfr_4E5~q6{oy--FM^ zV(|ld1TuBq-Yk6&RIAnZ&J04K(De*ttwIkh!in5mTNi`D;1u?qg0nDk-?wl8Nv}o2 zFchxynLQs_qcE3D{`;%y{+zullgYSW#eNF9;WU*>T?PLNFaXq`t~@2GyhH#1002ov KPDHLkU;%lky)R(UWjsZ+ntBIV};=hHXQ%IwGxP#^;y)l`*RcFZtxny!rj! z`~KehjcQqzQn6$*Dcp154OSD2#a;x$;jr?q1h2%V;WnL4|9^BOwuq^=0+usDD@oU}q>4YQlf=csy&wysE0EN~O{%@_$POmR-RV2+5O&jeVj@N_kK^sPji@ zP=-GL{dJ0}AAcxm;#;q?2SULB+`$UWf*a1Hj|T#QEqntoNHo?f4cH7&Zkjdawf{Fbazz8Hi-}&6<%b z+!U61_PAWG13BvdE|QQnEY6DxlkTUO{|O^(%U|c0=zabds$06Q-&VVcqG1tv4;Hf7 z>S)6;YSS)_6^uXuyJ@r7?E_A~xT#K74{i@gNokxD9;1Y~g`xnk3>Xc|0 zhQf8ek^K=i0n5?ozoj+tc)aSLmPjP*m4%H%mwnBn00RKcU#Y2;n+yp60000 z00(yzd~ydkmM{>=#|{)x5f`#vo@|*B5i|+b6wrEp;yAVvOMgUyv!BHp=?ySZ)re#_ zgdp%>J|4n!wRHk+H}wTr;rT5HLLZ{_;kCK~DK`KqB`fRU?0>FO*zZoxKKg?mnLU=l zBwIJBM!>78?f+_W=m3-sNTY_DGh!;$`7JmB#-LbGm#+n28DJUUKR|N>q^y#;4YGU{ zu*h3@ZxDhx4LG-1cp-IHl_B$>VP!L_t(|+G70w|33pIfQf-Zzycy>%$R{9xbe3ti26^83;rWx zf7aVgFa zCVl`5f}s-srh<(PM$#X`%2Ejs3o8;V%xp|ZERmX!*w_Xu-@(2_R27_bjS}@M}dHu0+b+cg%+Nb?@dj&zZC(Vlj`i@ty2nkz6g!;CRpp-?Y!K9 zis5-{pKGiN0pIuW53)_aNHFl1Cuu4Q*@2}%yfWsK!gKn1c|0v78)5d*Lg@w$ZwLoxblL-QIiXhS)wT-7tk zIZ%NzMu9*WhVAk>#RAehT$e&77E(@Hx&Zx37a+Zh3BP>bl0>uK5Nq^@_L_t(|+MJS6io!4uhNo$5(t;=27ZF_4S1;fVJVNWE3nJdY z3-~1NF1~vwZFI)`5ehCT8w~vLGyi-{m?RMqdgrLFV6yqGpsqX#O`L8|l`(k@f4MaE z_u_N;@5Hg2Qj~dJ_6aJ2rZbfIfq7)rCu3m!FOL49!eb#zefAWccC=+5E= zj~X)cynut%p)#fRkjfOX0AeqA)R3VEy`9UM?ardq^D^w<{rn^O+mnS>-CQm8@}Bp$ zvBBpEg4W(hrD^M}=kQkYvG4Z2m5u(Uq<%f+0B00RI_2Wy%VLgqvO0000< KMNUMnLSTaIwSlw% delta 285 zcmV+&0pk9}0^I_TNq_%IL_t(|+G70w|33pcfDxBQ&;A|tAbNYDMp2->s3LMh~D(+&ml&oZK8>{`apx7`}e_(Xa!}W)zLCz1!=#xH%fQc{mwZ z*;v40zkmG!YW&Xd?dy+*-Nl}b7#f|rw$^h2ZQ|mFXkuh!1b>Tzs3PCQh*PkTt;oOf$&YKm!^Ml>0Vf4V>TwNB=W1F@f3t{{3TEn_$g|u7(9$ zQ2+Y*8)!2t)Q`WhMi*9%zkmN>U}9#5vx(OD@9%#g{s(6huMy}k5Qedd*2wVhKg0ij j|KV(s(kdYU5EftnzNd|@TOYgz00000NkvXXu0mjfI){+x diff --git a/platform/icons/src/actions/properties.png b/platform/icons/src/actions/properties.png index ce6649fa96ca7e92eeede513742db0e06ef79d67..188c459844baef6fa75681cba7b2d25edb5b9fc0 100644 GIT binary patch delta 256 zcmV+b0ssE=0_FmcNdX9vN-2NIvR|=kZf$La7yttMS+p5Ww?#8>u(B9``u@wTb^hicwu|L59$ zMn)pT00dZ>!DfX3@iZWgXJ+{K0of*k2Anx_j=|~Am8Ved2a;l8Vt;fu$cFzWCPo+v zaK!+M0r`ccSOZB>QIV18FaWv&MFQj{po{)bm^2NqAx!Ae0>g`!E=Lysj{{>EKweTN z0uUFCKxbnFW%M*|H2X~yMGMkW}m zD$pE69fxY(XaDEgeMUyYVE{LPl^M(o0pg879K_733CSeV$~4KnS&iHQ-00&IbYVL*OiDb_%O8cf&#sA3ceke5KNg87wTAi|;r zh8Hhgjx7Ek2gWdfyrfJ7U?gY&$j?A$lbo}_dExcTr!aqFRU;}cjo$!D06>5N00-$` V#R|K)9RL6T07*qoM6LruV1nALaWDV? diff --git a/platform/icons/src/actions/properties@2x.png b/platform/icons/src/actions/properties@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0509f46bfea08875a72e76a6f33acac8b6d31c52 GIT binary patch literal 568 zcmV-80>}M{P)RT zOGwT5eV*Sq2gtVK=VW{F@%t}^>gsBeEpBaX#T^13J)5&HKY7ayWbOc23dEa0^y|;x z+0F@=7Jp~vvSMdp{@f8}*-!Nl0D*h2KbZti-k}6!<^ypWRG1HlH#0DC7&0*Y|C8gY zJIz^3<_nTGQnM2y&JZwG5C!>M2#6O0@fIL90OI{XYzLAT`}t~ix`XyTATx#**^qfj zy6Y++y%fs#2IBKTYy=L5KOZ-0e7W`v$czSJHZ&iRf^j;)kC}-P6rAzUxJL$?3_hMe z3#6NYn44Awku(sS0r6iTjs)VvQ1SB+{{JQ%X8k7-<1Giwp!7E&_66eYppb#`X;Tuy zz@$l&6hXAz+e_%F`Y|!7n(lQ$Jl_MVg#g$Gd3kwfp#1wIt2TtC%#@TAqDwMhy)nE( z09G5G#is$5OOVov$?ysR7yzaP6Femzwp>EJ+Hg>W02zRBc%=a{z%WSzuzXIgkA_?t zV1)GzfjuKwNqB}tGfcR+xF~nPw{P&q&cHZe#P*H>0t^7dD3j%Q;(tT{0000h|3QJi_$d&YX34a-vZJzfVhlmApip>PoA_ya-0Sb!@PG7h#wnT z+A8lBbjks;t(bm)fANo%lcBo0nq-SxTU&95z$5qi)^8Hp0zl?9kflI;2}J+q5#!h? zBQ-lQ;tT=SFRzyYDIp+U48&W28047!Kx_w+m;do-w!rOupeTuP?9zCgSki2a~^+LVMa zU~X>S0j6KB?m&}zOiZe#dtG3AZUWUpfDu{}o*9|7AuMGA(*V&W88EblR|vpr!wP&F zV7UY-t(Xk25J2*2Cl09&JS8D@YQsSh0%QQj;gtr+0K+5=!16hs)K1kjKyeg2dGdr| t;lhPOw>D%!DuM?j4KR-Q-Z4Oc0RSd}kaCqXlnMX<002ovPDHLkV1hW&=o

k1eXMmNq@OXL_t(|+LV*eD}+H9$LD?L{k?2*Sgj%x}ojnK}}$3 zqgEH507s~*5Z%-}FQk?Ql)lE2RE2T@;G9U3aH0@q*7YS>ID+MFWD(gyQhwV%1Y8Cl zfZ~d-kw>j@cE8Xb!e4P@3F)b{`*#F%AP^@)sf9wYN z;2#}I_F8d@w~Zu!G7?O8VCk~bBPxsFAGpQDq delta 498 zcmV+W zPzwb?ESBDb9t3;tL7}J8n};fRD(%Tbq29zxK+GvZkPuHEwWvvxb#~_YW?f~qB*q87 zW#$d@_Wyq~qaY%Te*J?2@#BcP{~hiTnM?*$IY_iP;3VvCzkhjmA5DJ{X9PCEWdYMN zAmQ2x%Qk=hLnBM6m1b4w@*`vsLkG*T9`CY__b;Ke(p%e5>TSx~6L>Wa6`&BHC{l?I z+-d2{@l=}9Pl#D!l_hkuyN+@&Dw0T&o@T~*h>aGds4Ha+Rr{Iu8V@rCMAgC=qToQoR^8Wk~Z zW3VU4=iXK~t*9q(+eT=CM+M@L9eLe=t8)U6&W? zRn&v}3dlm4F}B9eSsH_&76btl{fGU{oIis9dh)6biOcw$S0KmD(6Sl!AcK`qY07*qoM6N<$f^GBb2LJ#7 diff --git a/platform/icons/src/actions/quickList@2x.png b/platform/icons/src/actions/quickList@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7c1c707930b460b9300f46e27df44532aaad173d GIT binary patch literal 1167 zcmV;A1aSL_P)xqS6+tC{;0Dkd_wu5`EBz;-i9s3I-Ic55^mn;6t!jL`ABor4&n) zSgQ|_ZnRBm(}b-vJ3Bk);(um$!p3BixI4)Sf6nC0$(e7y|NAdPq?Dk>J+Gcn7l+Z_ zhC0Sxb7EEd1_uYDITbJHx(0}4h%x>AnQ z(QYeW_f!kFl{Fw@4J;hGjv$Z;m+{{33fB)vA&1oZC)c{OI4S$Aa{t4b$r>4`LZONb z14U_b2`-nn11mm+Hy)jsbG9Ss1q?jaa z#46%QLs43eg{}~NM208t%S;`oAp7fQV3l!9usrBkGZYAqi(5wKHhzm$bZ>nB@zzUg zqk)B@B&t>*3nmCIp4qI;?7Z1_o9bj>^#CGKmJ1hWV*H%f^3G3Q<}LOAPqa-Xn+K|l zoG#gkUViz<9&I`U8Q6tu )L%8pVFTnpzUI*i{84CFV1cjn<2Ryl9x(*Gj5Qb5t zp!&m*`FrHArA$aL52P^n?0DB2fj@5YCyHw+5FZr>|(9V>Qb1ru4J@<0W1 zPj&oVmj=$_<$DO^7_u>|DxX8x3jsCz;*J8#H4TgWz(DJz;Y4eJ6r%t5p*zNQzxlPw zbihKUf*!iee}1^AxA(=zXqb}G_J1(d{-Tg#Q7w47^Ga(CZRrs+r!d`?L`vpa*n=+G7>DowO=OESuvF_>KJcy%>b`!S z1rx=Tbweo&YN{xux}EUo&gQxAap~m*K1`~PUe%Jf$=s=uk0sWEQmb}V*gHf?<%Q$` zEbY_&o5Wy_XP|DE|2{rl7J zPM}yLOcSyJjJRBI;rhjTV@=bP>%Xrsyg&S=0V>=`j0-wmIe&drG0@Ske(~ld!%xk> z48LCfWng{8T#C&A3>ScGHqeARNxMqm0AHZLH%pyrk1M{WaM{Yn(g z&tEV|ic78I*uoMF)5L`Af(pA2j6fGKzI6S-qOYrmRkN$JYw&MRMg|N6?%%%;rsFSM z6m=1mPQaxZJ!62Gup}-m?W>~Bq5NkI{xLW>{${*>P+aOd z+h4ZegS!r5P0AQ9c>nER1<;T^K&ES|n7AWIGkr1>xd0%*0BYU6PP9@^3IG5A07*qo IM6N<$f1@!|j*a@AAIy z{cOxE&)UXj!&Q&rg_o`$7_qqkXd5V;uIQ@kXQrvGFCF@ zFuZ{70%jW~UM&MH4iwFI?=lDo2)^c(;J3j@2Ot+z*nMD>%#&yQ?E2w0F3pk>Qqo^u ze*TSNz_(fN!GE;G<%=wtf0->FJ-mxmv$4L>Z@ejyoq-`j=FeZIf{))B{(k!g*DNk3 zA&0IRB@AF-+tF|7%9dOVvcM22V`TqdFD`MHlV4Ex+v~4C4(>WgI4^v>`O{|7@o&ct wF*9UbWo732|BFo(q#0MLWE}9^2oPWZ!ll84)4!W101E&B07*qoM6N<$g4IaFTmS$7 diff --git a/platform/icons/src/actions/realIntentionBulb@2x.png b/platform/icons/src/actions/realIntentionBulb@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..757cf33dd26bae20734f5dbb0472e968b40660cf GIT binary patch literal 772 zcmV+f1N;1mP)22iS#qs~6+mB|Ng}{xwH@XG*1&aju_<;s6GJIC~!tmwUcLwI`a3xJ_>wu&KLo>BQ zVBH6g?_Lt(;)PtCTwu#zym`s+;`Iv#22DnW-@kq{{J-=YW=0qgH&ZnPfN|a>$R}7R zz%PJmITXAWf6MSk=m&$)GXaL*a{m~qnFi*3aQ|*BAt9cR;d3Z>`Qin`%jZD86wpwh zshl!g IMpgzyX<#V{@P{3xyxt`@OTM#uup!=iScSUhY@mzvFhXM(4$@T1i*@LK3 z4qU%`qf?MyFqc@LiF`_D^21e;$?z-#9Qv>>=r~)U4UMFg359b0G8)W(fZIRnGIz&jZx5oahkv`}w;z5QAt2Q$#0f-j?@qVBq4jj>Dc|grpG2>|8aKt+RAiw~+u#7g2+>bl}0000fd()#oO^wN;qeDy20a#SxFfPuQ$e0< zq;?3bJ0Nk~TU<=6fQy3*Z261VFBo3DdCBks7&w1^{$|kns}3_Ggct{q6ap}x3-Ae` zSPldGUmaq2`tu2couCcF%|Ex9JQ+NxmIme=lsI7m^m!h-&tc%j^XCk&Uc3Yb(@O?W zrTc~J>r<+w0ie&jfj-Z}<@1-%Uw|!#fqNVe*RuU$3!z3X=sqNIQb}A?EQgB|>T^(h zqgnp)#S4TP5>ji~{$N^8RtVgqAV3_(A?%6tC#d4O7$6CDD7KY!N-Vi3(>{FlKYo|F3k7Rxt~YB^D9AZ%r$!gmoB z9yVE%Z$K^=NX&?V!NLAN%k@@+5fT!9^7@1f$9zb0{h=@?!^87`+qU3xLz>K z5$VFBn*aX%y>Wz@;ReWZYPN{bfdh#6^ZsrukXphjrVA>lE`e~SnD~{`uRc7Xc9RSp zC;;&yP{jsx#DR1M*$32Y6EcqW4M)5K00ImEMKqP>iGY7c00000NkvXXu0mjfB#v~- literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/realIntentionBulb_dark.png b/platform/icons/src/actions/realIntentionBulb_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9dd005c9f37f7fdf0e41aa654fd38f657afcb531 GIT binary patch literal 418 zcmV;T0bTxyP)PrRABu^IEr2PowY5bx00|HfusPzXoc4@q*#f^9u~m?aUPhCzi?61MN~Qgmu6y8qL%lQrwZ=RUK}8#89fXj0^go^{Na*0WAKl`!SOfa z^@HM4*V+EE1s~jXkjT97|4#+bkUc<_YpR&IBS;?eAED#}?Cy!yvvBCpzc2rapm|nJQ8HNF17d)Tz5W@wEii)?MDZWzqcjlMM z?@zxk0>#df?`2vXfUogn%OTWVA1!NbTe&zU))j(I@07dij z7Yvf(QujHwuLzihh??m9?ZUU>iQ wp8?R2r$FY`R59_*AkFyl0^@+^Mt}eV0Bi@gw6gB#t^fc407*qoM6N<$g88zuJ^%m! delta 407 zcmV;I0cif71J(nONq=}rL_t(|+G70w|33pIfRSnjR99CwAc=nk;*UW54v61CF^K)F zwY3$y0VxNv!L)&ok?-z@-k!Sme@FxTwxE&$rb2&A%f)%8TLv0Y{OyzZSnkbnQ5!GYlbVHYqlykoLu zRMOVf=DPRjKEq$3{|rp7>-xoHEp;7PY?>t{r24+R z{QMWDj|s;3Hh=3qn3lMFkty>pv&^H1cd=?V);Ic#9LP-Qam>!Zpd<6=FJr;S?+kyx zeS>Qj7nA5m*Nox?7}$37n~Aa|7lSM?eU&k?|F0L9c+bf%IPKf(uYV5iI>hIS00grJGz5Tvsv$s*15iRhGEbf& zA5M8Wi{Zlci*WuNhpD86!1GBDNezJyAI-iQi~SXm{deyVNY6b66Na;N3xON=Zd!0Y z;L!Sc4;}-?;ztGkzqI~vj;u65LI^zn==oh;TwFqrO_G)27uR=&4=3Nk^qTPR;$Zmb z_TwDQLg2>T8x{imf_egc{0xjh_*vx(!WP>MU`^k`rRAmg8an$ z9G~SRSI3ucUNI3D5!V;wBi?d1XSZD>)dlF)C#Wn30bqG<1PpQ`ZeXypv$0dfa$He> z0diP=ajsNR(|FCw3FcGFa-yT)-;ZB{p^SfdM1FqzLQTsFI>6oC9ZdiI_FVvo8G?U) zOS#Q4ZJ~x0d&>sW3~5yW}63dLy7C zZ2vQVSi`^|fSlD1?mEaobq9cof^DbYsxkcedppTVR1u~pQ&>!Z;m^MhN0=Et;LGRK zaDWtu*mnMdDv-LJZ!Q?pgf hINCQH@eTk8FaW1;i28=;c6$H-002ovPDHLkV1iz}T}J=_ literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/realIntentionOffBulb@2x_dark.png b/platform/icons/src/actions/realIntentionOffBulb@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..2578b34e22eaeabacef4e8bae87f7ab05dbcff7e GIT binary patch literal 800 zcmV+*1K<3KP)0{Sh-E|p zachSq6_xk6PZ1A_Mx(|8K$xhj0|=%#zzqGUI`EX6fTd5%yOX@Q`plREXrlT$(6Zn& z>HxoTCUY@Ng-)Hbx8X7AC0Ks9?;0@bKs=qe)ZcKSJ6LIjatX%^efQ3e%TLnJV~6bk zGuyJ*P5Y^E&bkJv$||%LX=QBx7k78px5OIyIpP|(DOdO1Yda{^jbo@ zLEPyW!)?rL2Qstt;%SN`!_Ee0Rh-SUz^-w?0tce74d3*X?fcL)+J%d(Xag|^B#5P3Rs4L9LqrtIe`z|O=qECS`F-E-lLT{ z$FNm#1?h$_8C%&lW5!poJWs!IQGPPybnIk~*IOmdvFx8Y=s?CM){5`Tfp{uD=yiKT zh`(*d;(1nEoYEFId>nsBd>kN~sa|aRp5kn+_{i|cjG?VqeSG4>1Opu?{ixXb8j`SiR)ehX`^&k1u;V8 zDUcfi|A5HDfPxx{F>z(Y@YoptfD02BY+bo=Z9=&Bc4j)$4ySVya=l(cfY78}^t9jk z9xci99Ii5)^A5Z%9W1||+b5R>;J&xuad&%bcAs7fAP5D7H-G$5F4)fI%pSim0Amz_ zfJ4~gKj55wef4a&rM^xYP28B;xkV{0QRZ~{KEK_1GvFuzvQ$I05<~e|{){7aZ+7e9 z-~Rw!PJemKg}W()7urj%$H2o$sRQ;{mT8dH0_0aLRma?$p+Bsy^CQ&zAqWJqmyrPw zQd6k4snI0_gn#dWG3JiZ<~?q87632CKDD97cL+c@_rP&5HSCz@1{z<9&C_M{5WN{L zJhF@HvT5P-kTC{UlGe>1mzAM2{awnW_vvc?(P;`Ur`-%G8>4?Gi7H7Mw^u8X7+kzd zvNW@l5mbXx>RY)iJD)7|9G#|Q7wS0eXwb(vN+w30_g6*rU6Uj&jKmZ^Bk=Ip+I{s; z%r%qr59~NHxjvv9X{Rc+vbNFv$!7IJLKLa_X2pVmN>?gnIeu21T>Ec4Z=47)0GaB* UyQKj&i~s-t07*qoM6N<$f~30VEC2ui delta 486 zcmVL!Nq@&lL_t(|+N4uWOB+ELerIQPXO>+{@m8-r*dO2@=*7@lE834k z4k*KyLnM05yI_0K&NihCwi29kGJeDZvVu zjQ&AyCKHeJW}0kC*xY4|CD}?@>o7COCYHZEFBqNsG zw^i}_<5Lnxv8Ifm62dV2SuT62>Gc=ajg<684Py`u`d{i-gN2!mm(}L3K@cTIVhZ07 zcyfMgJiHTg-6VO29cR+puVgFjD2%kMeRMzFuAXSly+0i4H0yOV diff --git a/platform/icons/src/actions/refactoringBulb.png b/platform/icons/src/actions/refactoringBulb.png index de41c4efbb6c744ee61054560f0e6b2451dd9be8..342a95abee7bbfb546f7d6dcd38ff2b30966c74b 100644 GIT binary patch delta 383 zcmV-_0f7F61knSKNfL8OL_t(|+G70w|33pIfRSnjkzN*mVl{vXiLC_0cYrt!h-U$D z2oP71;sOw3nPi@P^z%s%8G-EYK)eme4?0$O07K)lWy>&J00JsN&6z-YIS{h~@dB6x zyEFGpRzB8mKxREIFMxm+5LW_m7!aQVxd0@{l_pqk>|>h7qtDL?fDP)xit|6BvqoCwnV z;`IxLmoI>r{{@4LzVs;s|;NPB%n1Oiz{(UeVf8nC2i>P#B0xr$?5)wQnyq`Q(aDVpV03pp- z1F>TDM~{wB{xb&u7#tjbGhRO^E_I#lFI(`zT?Yv!WiWXE?Oz4ZkUc=AYpR&IBSTNq?tFL_t(|+G70w|33pIfQf-Zzyf1bS6AN!QUXx?1&DV6aTXB2 z2FbU!wi0xK5)j`3;y56l1;imhTt&1Cpx};Vp8V41lO8SuvU7o09>@nvOnEsAuIR$` ziwtudreZZf1*ka_NZSK3D-bV$YGC^J`p@>CyS_Rx%d@tz*?(}=<8px(5LW`R3=p3L z;%y+!K>CWlje+Jh=Bo^!*S)I)^8Yh9Ff?F`g-t*w%K_;!Ah!6&!k_@stgEi0dGFDE zhQC7p8JJwz8U8-_U5(2HFt8G6^tU&5ANK$?%Y!t3{r;8V>({Rg_dnickg<|Ehu46Y zt{t9ej5w}fSMTle=;yEWRPdzVqiF|tc_i>q=c08 zmzSS^W2A#`v)+SgiOUyRGXFALJbHK+t7c<;qu+RwGCKo9gv_76Oa&jmGyMJb4X#;S zOhOJ_GuANJcJy1ivLzRTEHICiF|z-!7niup$uFq;?LYO`9|w0GB%GN(-u!7Z>G-!} whnN{MuCg+7{r|3xNq;^`L_t(|+U%EKNKo#?p&U?4=Uu0tX=AVcDqDfBc zNzLdbqtS~JMWj6>1{y-CPn8f62>BFNMv;UBX(<#MnFL!8N=2~EKeTjicVpLeuHB8h zwRBr|`cMZx``vr)w(mK=^ZR!Ruh$D(X>qW{_CEkgu%orL^?w;QnFxhQktBpc7LW;~ z7kMT8O=oAPcmbdt3E@jXl93%qJ#rqoxfvyxL|!1H$P(`(kZxpKOiB=BrGjf3ndVDF zB6_56GY6p+c@h**%zFTI=d%6R<{Mu~!K3fKXSb|(*8Ptu;|Krs-Ll@u0uYGr$L1J+ z%LMgCfSKMHdw(fbQ@uLtap3I$lt6p5Jur#FT&qR4^FD6vzJS@ALyFIS>XA7Tn_ROF zpR14_S9z`bY#q@AP#nV7jN-RLec3o;>e8lbFG_U@;FdeV_IA1X2T#a-P zzT**Q+kw5Z>$l8jOxp%4WI*=rxJVFSS+Ig--U94y0+^j1aIQFg9FJ-mVh|o|dIYZ1f|_@!m8q9h zN)?b&(l73_d3q5nsdM0F+^|A1M8wljVB?6J-ya6B3`*Nk$7QWX+aj0A12Xq792N^$ z&6c$_lYcvQ$TH;Ss23va1#aq1A=i-COBGD_dYSvhd6O2&1|=!d!++BQ!0!RHeXr{T zl|j{Pm^p7+S~p0tWNlO{VUUg4_qh9#bCgwF=6@^xrxFkX0&GFQ+?1B5sR|zL>xoxZ zRMv{J8R2?mtDRZQ`)17ID_0tD(@D_PYZ*N9l+8wQ})>wg8X>?}mM7K&LYJ0(+$h#?-< zG<@3dFo!KoOFE<1ar>*B^A!P<9q`7R9suO~#Br+Cj1G^Ae%%lbY delta 947 zcmV;k15Es!2kr-uNq>+@L_t(|+U%EINK;`L$KUN7x3+1XeRO6i2pQ&0E6NlF(=;uk zyCBHugQ!G;@UFm%^umko`tl;_yM*v2rOXNlV*@9^K~S^kBM=nb;4AO|9&DETSAkog0l1cO4HSb+kO#Ja zBZ_+*$X)J5cn|a|u49*a3MOLhnfQtJ+hqqU4}T!~1NW}>S5Eugw$An`*VnTu=5Ih2 z*P*!pqUA0psDBTBuI2t4R%{*JiI4eUAE?rwGM0rq0vACU#OXF%FK1M%0v;#!TiW{ru@(Z}k@cT3cVz8gJB zp-iafunk+mJ0Qw^8oC%UDx6YWuhTy=bLRX=gMo;mNPk=r?j%i?p;7T$)WrF4wqY`| zr7xfD^3c-NL_*YSTSk=!=NXX{V3%4US}sMP{QZ-=DeY7ni0H7X<&d zv3Rv=o94xW3}705BJ;uF3~wnP$8R=qCV9^7vx;-koSnDCZ1cp5-US)JoUd3MO-)H1YJA?f@Z{a*YE1??i`mScL?!hD!!QYKziU9P8=tj3Ps|; z0)KJOBJNz2dZ3`7fLuFDYg3Y~?BD1&(Q(${*a&g0QXF&c3^nZY8iB$)&iMPy0!s2_ax`=9?gXW!rd_rD&F$Kye3X>n+c?SBAV--@=jwnyMp z00HoUc)$jjfqtL`=w-iCQBe`S0Kg9TspA3bfpnl8I160)8(r`g=mL6xIl7JmGyy3w z=>i|y$tsh;5ZyHbpcuFj>j2R7J_}PcO1mVT;H#N{n0r@^*Z%k)gSrpi@^wv1M6*D^ zj_t2bLumbOaAou*o)w*eo}HVVZB1KJjTgl2(E%4D8iXK>nS}C7Km_2my9Uy4@b`j# z?DHk1P@z@1Q`HWuV=Hjs%w}yvxB=wSq_XPjK)lu8!@5y@vqDDJm?UO2>K;e71sg;C z38J!L_WR7LcR0SA5iCUPiUHc=DW{~%c;sz|Ainyvyjhx%R7=PRn5P^>O;JcblZ z+3d#}_U_U&hLV9i5Xu9;33yD`Nr2-%EpH-aL~T++l2@EE8_}@y6MAPEM7B9ALs?jZ z5Q1=mYi3ndv0J_&QCf$^1$=>5oUs?CUi9?mGi0~g(a`)zT*&JH%U%HvdVjbF12ge; z`oKAboU9cK#VcCQ7-cXZ6JabxRIi~*Gff72j96`Je&afJ}ST5 z-ZnSYf@YH>ZRf#l<-7e#NQP;)Ml;rBPXmVMD2h zQGQ+mX`Tswti*aLZZZ3R3wX81bMp;I=uk$~i8z z+`c#wjCfH&QAxzRq3Lq!GT2;;)+_*(*e&Y)PJ4H>#DmU&Yu=g-V2^TLNK+}2bo&v1 z7^-+s)9`S6W13Z#5zklUEyAT3*X=+^lkef`?jn@QhzneTLp@J=qJJa<%U?2oJLYkD zZu7{TQYHv(vOLr6bm{xnAw3q4*_jYbgMXaUqesEr;St+7^x<^qBtee!n`S0sdME`; u18(7s4T9*_BGq^_zl=El{MYd>0R{j-ahJ-L&z55V0000EIk5xZCe)SL*?{NnWshLA>z{POt=21#+Lbs?ewPT0J_=qGXv9N8de%Nr>51j!3@km z4B}h{rsFSM6m=1mPQay^n53-b{p6{F`?D7Z2x-O|h%Dcpc>Lj#Ib-mT!NKu2Yj9(wR5o{DXEvq|Q| zH_2|gyZPAUWDh&x9r7l>-@NyGZ)TzhA>e-wWfH(7fFl>cnHQI(;}zOc>+vVr^A+KW zacFdK0(mk)WYnQm3{VaI9wlzSF9IQ($Z}kkD$Aq-dAL#mgpz71RBRip zi0mxNx`jlug5!cI#yQW$l@35YL?cLMA=xw-Rci*b{EYs&yk5w{om!cnD-{5fCSOz) zbh`?sB(tl>6jj|63M@oR9X`AO?&Qk+LZJW{${CxiUszuYOh;x^bqG<{(cR#o^nK%n zaI?=YG{!3+>p5aT6wu5Hl1*VomPs`Ajoj~pjaU?S;_3ONF(r^0u!ITxl9&ba=FrifxKTnWGl}+a zzCpYGhIh~bzwH8}6o{@C!hN~*b|Z23q&1pNM}WGFC1)Z&a?qptruT)g99 z=4|Mm6Y*9|$K^FfQURGwUrGU6NOF_9-mbsrLg0EJC`(+ieM}av)MXTtalXcAaP`OC zkGtOAHuxQ^IgM%#BNp|+FfM4jF|L#XAZ6tAHK+W+&->9Y8Ipz9E@a*9GV=i(mWlfN oE};AoZt_<=31AXH&iE(506Z7(M(^b literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/reset@2x.png b/platform/icons/src/actions/reset@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d868d336033c0fc8a69fbb982c69c430be3b6f1b GIT binary patch literal 1062 zcmV+>1ljwEP)Gv~5z>(al@X`JJDPMv)`jz4@G_TFo+^{xN%t$!0^3@qBz)YQ_=aP}(VtzIvx z)oRZVD2&$LM7&bugHaQBy(kGjVgj#qc>?-{qX+>q;KF8D5~KD&FA}7S%uOfItBT(E zF9H;9v5m?DWB^YTCvfb}Q-zuA`R!p?Q5_KTu#=^5`j&)1G}(*769*EOVhHq5a}4bP z(PD?fuyimemkD8P<&uzI(GK^;Ct+CL>X)O=!(@f3fYx-y3EZ!PsC>5{Mc}vsWR~?B z`a;+I(MSl81+$L3?)jipskmVXR5K_&47BYd5QY%&{0KO6w;R(*ME$Q2C~Y87DY#j*5`-Y4)dN}RNyrWtF~$aEOGMN=Yx1caTo(efcq}EV1&}@ z!+Z8`x_|cNFXg~Vn6idWGuWbxI_i1R9zr`Lw3Lu$O=y|gkuE8I5OEoi=Tv<>J^sxE z<@_m2ydAE5paq^?G-f9y7TTQp!@M)-N`d!v)jbk00>@%c!b*#+q&{|^BVi+vI z{5_I}ga+^zULRZbIA2UcM6J`Im?x}IX|39oqm-QeUjmrXrc2k0*oE$!cj4qdPn339 ze_IkpXgUzNc&7&SvCH)L4Lo!opdN3lrp*DYpetC0hX*F`89P5oS;2I{ znkSTE-E$DW2lo5U?hVK|oxJq?Ol@ESBJzNFPVr6^3D~oPTG1kys#dzw{OybT&K>I~ z#XbLoux8&GhCp|VjH*?~)3AE+>2rs#nY;Vfi0i2XcmMzZ07*qoM6N<$g1e>#HUIzs literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/restart.png b/platform/icons/src/actions/restart.png index c910a5b960de60dcb828374f446c0893d621d1d2..d44c698769683a54512b417019ee7257e9e030c2 100644 GIT binary patch delta 448 zcmV;x0YCnS1pfn&Nq?b9L_t(|+N6`uD@0Kg$It!wo*6SrSd6h25jKA1XNncdLQ%?( zVkG~AB(`jrq!cz58fC}An+-Dy3qQ83u(45$_q=!SeV$WeI zUHH$y-#OH*bR1SMx3^}qqwg|k*y?q`^Le%`L)gyD+0f07XX6CK5`*`;1E^+Y^Jaw$q6NBLhfh;6)qP za(#7FVK2{JJ%TpE0u~PLS~NpwvDVJR<3m=^jnbHEIFWsSwLSWI=%ZBLqM#C?kSK(Z z$cgw56c-U%3UU#NL?kGLhC*|D@p**?Eftz;B%Iybot-s%TtdP*Ofoac`_BC4d7qhq zuIqw-H4l)h*DiO)LQ5U(-{s*?3Ys>0y_FzsnmV`a$mL`#{(mw52~f4zMi53rn2;fa zP)O0#B3~c?WDHn_3DPeHu--w}Q+ftOvYRUxTT3Wod(5Xb%Nbxw045Y*g#rl!j1Yhn z1)vmx#?v$Wq@ZGc)+_$NJEFq&n zo;J?>z6QdS2Y+tcjfsJsyX*opm5M`*BWL~F`d1!h6x6JCC)9wyUN~a(VsLjYn~X-I zISmen!*2?ZLTZF7yweW9y6GGYh`dqAkvrUT_}A~~4dC!AM{sGB)Ac6+x2$znmH-Ky zEuXI|`!&EejTPb83Cu_-R_S?gE;Ld)Q(c@l;CAZVmO(GA2VihU3t5mBs%uy!$-Dtx yyO}sm@)x5GLU)Y%s7?!%$9w?rzu);)fB^sj=h5SkIJ6T00000OS!jR) ziGYF>QBfoq6R1Lis3;-@AtR81h=_(rK_aF=AOXQda)X2j6#NRBG!$mn-ngO-G64zE zAW@J=iFfUt@0*qr`tIs-R7Z(EgU>IJ?b-- zfjOYP`QoKlJO51qgV1aT5`v`G(?Y2h&X#fQ@xj`y2!VDSD%Gk~2He1(R$8}&5Uj|N zQJ*1(CE*xR7Wo(2Utc06xdO4WuVO9$qsj_g>010PQD)F45pA?r(0 zsR}?+N*jBDMaXUqy1qXk4bQCtaTr074XaF=BxJH|nR1%@>9v)mk*WZGKP-g&Ryq1^ z?Yi*DC7uyy5+EUL0xA+X&o(UIL*qYAP!LJ_p#Tvvk^&E$J^T!^`!m<~d=GJE zPdUziE5OECg>6TnNGFNnxz5vHv_}fT{bvs!RgQB3hP7WU!*~F%6?=UZ%bx%jfFFTt z1F>#CIw0^?>*%Mgk*i?;2Z!!}@m0T4X_o3pB;T`MW1P#4dDCR(y2(n=Jw zJG)f@>FB2v%7zp?&kbcs@_E?nb^F~eWRGp!C%PNL>xa0m?M9RtNEt6iJ;)x~w)(Hd zwoBV$s{*cWa?)Avkz{cg{>F)COh%J@Wf>6Q?v@KG2%yx`C~}#IneZFarp+k7f>fV0H9rJnB>+z^vGfh-WcXxt|ZkSP3M_mmrZ? z0+P#8?GsA8bCY+20me$;=NFg$Flln$5)fP!inrTWVE*M>q5u!H(l?;O74%2+1x32# za)Vj`p?UaR%W3Ox>;x{)wEr|odK@Zb+!1x)kyG}V%t>qwzryQxfkyz&4LNoKJXVh{ zeg_qf!RwI2;8p{2>m{h+HF16ld9i}EHN+sB*q71jvBhuD3m!u#eiyDJr{a;3Izw8P!Dd%3-{gk?h>Yy zg5L!DGeDtG2$OaWN3S#bT^WVUSMsOTZU7?;3uV@g#b6*F&wpB;dz0Lrp6mypLRq$4 z2bz#ECmOv-mS)!`ic?142H3b7H$fYKI~cPZ-{0U7`)ItF8tKbGB7#5(s2`cl!S+3H zV*U(wol2sZn)@u`Z3eACqKwY3PMm`k^#Dv`n3?8YVr!}->tdC+8ML+_b$0_r+s-t| zvA|{?QwHSd^?z-shXHB>?7Vx+1T$ilSk3HVKtdbvAH|C31?ytzHhr+)a|TKq5XsPi z0zx{GwP5~k;rO}J5Wg9qE;gC~MM{v6>*77wd{{oGaHFmU)HF~?PZ)^w{o>hGr+IWW sP>pXOV7szb&pobOR{!m9{19LOX9}&puv=gP00000Ne4wvM6N<$g33U<`Tzg` delta 403 zcmV;E0c`%w1JVPKNq=-nL_t(|+N6`eOT$1E$KNHFG>J_t=;Y$yQXM+FwV>|)0i_jD zP$=D;q=TE_SV8&+RCgT&K@k-ZbP(zwh~nnxqKHlJ-kn#7HT_`-^udF>gZI9l``$ew zrG#NZgCT?dE-IBu7-j!t@~)uh>d1JxQNH+yLqI}Vv^@_-Qh%wU;n???y}8*q4P+?m zhHXL6WXeh=uQRoU&6#RWi%o!SbEyuB0PIoEuv~YWCd||6YIY(P0Y?Oe98hhENx^g- zusnC3+Eyc7%`Wzt7$|oFg(#@}Q=$}%qywO9<3!gF)4RDEZ?O&9L(q8zuGBST-4|98 znq`1V93nL+iGRXIOk1&>2dk&ZIFpw1gMI&pn(*U3C6eBx4-keb|nUWBoPPuu0DnZM$WIT(MGOD{002ovPDHLkV1l5FyW#)< diff --git a/platform/icons/src/actions/resume@2x.png b/platform/icons/src/actions/resume@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cfc5049b6898a942f97b821ea1a77e05833e387a GIT binary patch literal 888 zcmV-;1Bd*HP)JK7tWJ z%aq18m88fI(Atn#Xcxgo1Va$JBw!Z^{sHZymQnB{T|kf!Y{X701vQuK_l(bMF60vK z_I4H}jRP-tH#>Xp^FGh>&dxF^C7tD9{{i#^SXx>tL$mne!uyrp_os+EJ9ppxRzI$+ zP1j0}`-$t^U^x!io=c`}&ko25 zy1X{MIN*OO4?PB4hZ;dZUb|g@aGQZ;+SW4I*hD>-R82ZD2te8T2S-3`$J!PBk;;3Gx#>rEFcln0Z{4zAq3?^ zLM`C7MU7?v5N*{Z4mZtp%x?hrc-1zn?14d1fG`cR1CLxKNehxVjcbKLiDs%WQ0jq7 z?pBL?26X|zYd6Vuor~Pyo4B-$MOMEHwHU~udDRer%xsgaz$a&{r9L?%T9lk^L9huy zH9R1pwGesbkO0CAreuH|0lLH|vtds$Y~x^SUL`bj80gnd>xst|2)h8IJQ5q6C1Jz{ z0bu1O6f3IrYVZ3kcZUP9FSc;M&gH%COu-(9N>YW=YgZmr^fh( zgf~T+y-p7zO7=ra!-%vQpuz*%0A9*m+{%*ldy2#=c@`&xInwq3lCNk0h;YMwk>%@Y zl*poLR4gF^t6dO%e_k^xCiV6=OAoP=pN zDyjzk3jM$quCWgc1@HscZ-esZSs0T_o`tA7%S!i-zvY29*d^!kB>S4~qiRGRr-ji* zZCjdMAP(brpgej6ZCA4>6)JId5L2FJy^hg8l#Vte{ua=X&P{cpGlOB_KM$7gol_T^0Ml1lO&>?{HzgdnC8CB};pi$st#z93dH ziry6}NE(YXa#sijQbqzoK7e4A50F?SB(3Y--OTRJ_)O#ildK^6z{3v9v%j6^|NmoS z47yEu|GrqCXyD3ZW8+4EwdZxtIBocX&s`TlJBQWsUP%c4F@KE2BaHF2SHM<-mGSrY zgwH>fNoySciWqLVfP!4lHa;*>ZOjqCRPn|j|a8Bz{D0+RLBM*Cs5)VaD zfV#U&ohEngMm_L@Y2RmGSDx)Yb^wHs7le`%d)8VbYYe3X!0fUGLlz!}z6E!|Z9gnO ztv&b)Sg4KvZhy68zf$Q@mgOi-Q#4f_!ktc%mT0%tfHC?TPyUbKwdQ|`b002ovPDHLkV1h#{>C6BC delta 495 zcmV5D0+;#GFFJ;QARbhmea=#7kll z68E6Ol8c8`Sq}>e9+d^bA0YS}G>3%bnsIiwd!~C*WwPRgSr9BJrs=7AUG?6hX_}II z1p?g8&y#ifWxBrp|9!9YZi7Ly6q4`xO1{180K9wnRNgHqC4UbKMfI3cdgl!&j`49~ zr(gN9KO3qYV5?h>LqCWIV&*Lc~)U)LN!(=_Ak9M9NrktBlfaMp0XJI_42fb|EA~us$x>@(lpS!q$s0 z3R|N_n+A-SA?nT7=jL_w*=f6_ryTHu(+R;wG5{EhwXz9+N99)3*~nx3DvZty5Su#C zpVEPhjNMqN&!9CI^8mDohkaNNRR;2Z<^tr!!pNosqG%rgiQ7mp$_!jJGXP6ZtEtz+ zK&XV^{Q8R(u}MO$%~}Q^2ow=ekn1)i%kw~P5B&hm@z{s`SC<(84hE9E=SJwnA2zYa l#w2U2`}0{R-Y5PDFaXlf|5WSg?r;DA002ovPDHLkV1g~`^vVDL diff --git a/platform/icons/src/actions/runToCursor.png b/platform/icons/src/actions/runToCursor.png index 9ad1357c1b0080c44e9f318688eda3ba1e0f4c69..213a13d5ceae4f8383a008e3d877f465115d9135 100644 GIT binary patch delta 220 zcmV<203-j00qg;g7=H)`0000V^Z#K0000?uMObuGZ)S9NVRB^vL1b@YWgtmyVP|Dh zWnpA_ami&o0001vNklD8BW)kDFWy^>&0H%Rd7cenU2q-py z1)pTv{c{WlEH$voIUK)1J1dXBA_4sr3Nn=h`2{mv`L28W zE0Cw{>Eal|5uKdCz<5nS;ozZ$Zh;FC2M#D5VhIuFQju`bVPh0H*r3qh<-ouYwV7$l T?8y81Ky3`3u6{1-oD!M<_&FwX diff --git a/platform/icons/src/actions/runToCursor@2x.png b/platform/icons/src/actions/runToCursor@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..789364cd626d48c19848742ea9730b97a65a0989 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GcRgJkLn>}1{rUgj{;&g+S{oyq&I_i%z`!GHoXQ;$+j4Fi za5I+3^Zhn4c-0Wd-ec9!D%B>l;fg}k+QT2Eo%OlWm<^=`U;R^lSf%o@%EWTgVg=TY z&_)Z1j{8C{H?qm(Y`WZFD=?oWNnT-}W6Ir+^JiGKPBB@)bL4pAjo!FShUht*3?IW3 z&dFVS%CK$+OXGJ38O9^K*%m46;yqGVA*ATLI6+?^I^cFulB@x9hi&7JyAD@bXO{T3 zOflQ+ew&&3lH7ryxCRGhzCyPsONP6j*tTd%R`Z%Ysy@!Z$i^VEO3&=gw5WwZk1}|= L`njxgN@xNAUc+*8 literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/runToCursor@2x_dark.png b/platform/icons/src/actions/runToCursor@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..96423c5702fbc656c08b927b4c549181940d5e7b GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GcRgJkLn>}1{rUgj{;&g+S{oyq&I=~*>3XVW9ukf&B_&@B zxEV|2`F@)iylMz!@3CrVm1>jOa77_%?ctBo&iY(w%!bl}ul^}NtWx<{WnwvLu>xyH zXrqNh$9O0j@gAwG5K{DAoS-id9dNrSN!Eb5!?y9qU5BfzGfRA1 zrkHJZzs<~iN$x;UT!Vu$U!hx+CBxlMY+JM>t9i{HRUc9>#>MkC7NcFB^EDU+-c0PtT9B~ zz%YPA!>mD2tmA@#!^fsCQ_|*0$@bk}Fjst8GUuKD0X^rAWjU}3e z+&ZKfPb-$y>0$*Apb2RO|FUu(7ImDw56) zJVUW9;QM}5ByX2YCNI_dDaD514YngEHC7Bya0*+YLPYQaj?4u@G@&mSw039&!W!hD zVx?12+^&(iEAKEHEn*9H!PDH+yw#<>Mr0B`?IQjtjdR%3JYoMlwmJR&&VK?704eWa UrdYwU-2eap07*qoM6N<$f)Tu~#{d8T delta 373 zcmV-*0gC>%1GNK?Nq<*KL_t(|+N6^)O9Md=MlYfew6fLGM#1JpMIluXE3E=)Ewr%_ z6i$$&R4fi+@E-`aHc>26qzVxfE?5{V?L;fV!o()TxAJW`mn2OF9%2am7{*MD03XRg2o1BCpEP)eF-1bDs13e$Vs#Ue1Z+a=E;}DUpBDfOtIaG(I0xfGV&EOaxi* z20R9hpaJwaO%RL4`rH=;Fm^FG24>qln@-k)SE2`8^fPI`PvyJ84F~1AOa}Gf1Q_5o z*v}5^0Y|jH7u@c4@C%gjSY{|=c7kHCr9TEN0Ed+O4A=$EG#8a;)qzX8+iKCQ1*gGC zc5eoE!TGR9a9r6&ajZ%xt^*r!{Rn&|Ci<#@oclcRS()P~7#zlcgp)2~Dg1`xWt<2TX2HZNG>N!*HD;8jX%avlPq(Q@|vC5e);Q zm7!_w)If(EQ4W%RoUo6WruiO5)UyhfF;fZE)27*WcPh2mobJF zqH>=4*DfWg86nD7gKJKCpbM;ETsujMW4e6qRFdAGrt(IwFqCq;oU0se^Q^*0N!CR| zZ$ywx*hy=90`5*=aSOv{u!&!^y?*?|!4LZNUvPm5Cmk?C{_~&HKPkTj7yt@R^82wx RUsnJC002ovPDHLkV1gaSj*9>Q literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/search@2x_dark.png b/platform/icons/src/actions/search@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..16492c46ed37ebd793ac33c14543803f7622e27e GIT binary patch literal 894 zcmV-^1A+XBP)HvNtQ^T7f2oCZ6ieptma6Q<7@qO@#bYQLq$i2@6AJiU)!9YI>EC93Ba~%X+M}Hce z0Hw5G0k5E5PLDNR=r^nPM$op78QKW0A|ymRoILF^N1Zmc9dkoBTKz+&zN7~r5ln!OhG&5s3M zffA05zLkk4S9`|3RL#A%I=zz*w5f3=;#^MNOaZxQws7J$KNh&eY-WVgR@MShWQxr@ zPe2mNE=502&0jVbI-@A%Qs5?2?F>He$Hp;4LyXmL6jQC3_A7WRNeOG@y3VM5Br-1e z3BxQcVBB31xCQ~WK(b$w3O?jmgiEQ8QMo)7IVFB;!7VwtWI;X`^K`o*>>@)=YQkhD zs5v$=TKHS1pK7>|{azKCM*Vl&#Bc5~xjnM{B8o<%Id@1T5@XOU0n@=GFo9o0L%>M2 zG(}7Gx5*LZAnwKq`?O#%_y$TeunLwjQx<~HbV3mrC!$yf{YE!g-)<;jRzND;76&EF zQwJq9q1Z151GA`Xp@kB6zzA~`Y}4`TqRAK0o?N%alcr7cKR~Tj7-m?>?z#{zYpRV9 zmHRY*?Xty9N{H~4;&OI*pc{l3*LE$*HQg>P6{q*7D7?uj45i#I<0*$){8r(jB%7Or z-Y_qju#4LEdbE!Je?~TWU_HNRjk~jS(oiVmTLGs$aE=KllhGYXATM literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/search_dark.png b/platform/icons/src/actions/search_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..241fbbf5bf5ee4ecc3e74f678b2fe3499f1f3421 GIT binary patch literal 441 zcmV;q0Y?6bP)Zy(PUCwhz;*b6>$?BGuZ`#tlwlt3;0YGM z(_D+i1=b)3RhYURoLPkwv7=m0yXz>h4-Lq$a0UNuP@I7u9j&9lEL2$VfzLu+WR)6gTX`ciX`OEG_>&j^j&kB}(MR@Qdn5)Va982@Jy}3r6rS2E}E~y>>f- zY1Of+U1woM`IL2>EqI1vB;YuXEpq7l{)Ku!soVg(!KSrSW5sX>r?4F=Sb}G;V=fS) z3H`aCxdS5*)?im>w5_asyhi4(yu-9z#3rmmP2-xz%{J{dA`|cxJtoid!pTuMhYk2_ jd0pvr=hxVa{RuDtuW@FUn0u$e00000NkvXXu0mjf(R#!D literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/selectall.png b/platform/icons/src/actions/selectall.png index 70866a881ae326adac15951891d2e8daba493b1f..515bbd1d02be8783718f8f0eacbb7038f1d7a41a 100644 GIT binary patch delta 294 zcmV+>0onfe0_FmcNq-1QL_t(|+G70w|33pIfCWU%m@(rFu^N8;`eg!R=jG)=41j_P zVhnir@FAuPkWAlA$N+hHd1Njl3n3c_8N`B3vZ1c35ufIUrnY(*n~B)K`~B|^W9Ig1 z4|H*y1|)1M@%{4a8#9Rg?)yj9$V~;|$6sGIC)$9MZ>|~nt$)o(+0dc_FZ|~W{*XBeVe|Eu)>JErq zU+DMc*EeQd@;BbxMF1XXeODwWUVVL=4_$8G{o`VB8;et3 z{r(`y!pq6P#K}&52QUJC_59~M>BzPDX)CX6foJN47uG80?r2E<%JT}na=F}-&UhM6lF|Ns5_|KA^mG_~N3v8ulJX;v9w17XUZkM4YYu<6D3 zH+7q!7H!|Yebb;U2WaL1Mm8oUkrLJP0dWAc2pfk;rCJrMESERc9UxSy zlFP)y!ir0tO`S(bs8FSiO@iBunTwtJQNSe0;VMw3($1>EBZ4l+VI?Tfn<&@AEXb+C z%*VyR%*8k|{nX2vb91Qf zfS*slZe>^H_hw>bXZXkPkC|DECl%r_Rt82sc832P%nZLj{kZkE{A~CCpa1?*JqkY7 zU77v+-S>0<*_pr=GD9&VFVJ#!MutD%e?5QKa=H2Mo1Z^vQV#t8_3z)urmJ0lzW#jp zpA9I$%L>LI_TS%sK7E>YtKrYB&mU=85dD4p{oB`B_uBsc{{8VEGbkedG5r1i=g+rI zPr7~|efOL$CE=fAAD;hM_q6>V(A)q1{r>;+(CbORmOsBlv&sk?_`UY^HAV^6$&CEW z!oQ|IIY4P`XaZ})k<{j!`fNW{DkD(S8DH~xz}o}3>hs~#Ga|MPH|#=yam4qI0RjvF X5OuoHSS*9{00000NkvXXu0mjfsFgc< literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/selectall_dark.png b/platform/icons/src/actions/selectall_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..74ae140b42ae81ecf6bcd91b8ba0042dd6221131 GIT binary patch literal 367 zcmV-#0g(QQP)AgbZTACh6+x>W5GB z?%lgL!Prd11|B0D6O&YvPAa-MP6Nc-bh4TFSXe=9W>Izysb0e>c1&n`+le;d=gaTgSrmCZdDE5q7};1De!TyF>Q(WXnM8Zx zZOO%%KRV?f(Ds-#?-a04e@hd8Om$)Ay%7)?ID>_vY76Z0eX` z$x~fjeGj_izehj5eU87{^7qEKk9hL}zIY}oGvP|AM5PZ(vok<|0RRAXY)&jzGeSaefwW^{L9a%BKPWN%_+AW3auXJt}l zVPtu6$z?nM00G5GL_t(|+G70w|33pcfQf-jz*1dZjV|WL#Ke>jq%9d48Gi#^bo$@F zf0KdyjVKzC*n&U}OL%yA4Bgz^n3+Xnzp=A0{r~#>fzHmIJAbEs`}QprXh1Ab-Fsw> zqRh<9hxPUKxqSTt#4o)3$~f=pD@KsS|35tc@>6o(UOc!%_tK?H$N&EQYYP;94e}!w zP}2@8D=W^xpdgluKuu=Se2l-3tYg^ISIhA7{tc$S6HkSMf`eHtEiJ)nL3)^gjCpEm zYT_Oq9;|oXet%<~e(o7#amNG(YXeONmVe(F?(SL5@RQ*`6G+a}(~||LRsy64=2S+Q zM}PkM$8he_C5F={k1_~yvobJqvVg^q066}bfNoB@b?erP?c2BiQ4!|)%>)bqVRJtQ zL4JM)K>d<`sBB6-8ygr0DGR1@dVJ&iRcM{k?v^~Aix0n XqtOs7N)AWY00000NkvXXu0mjfE`tMp delta 502 zcmV!J6SJ7U?w_QLRE1>R&hjFa%+2!Y4DXo8<II%u9cfz>*K*F1g4J%ZIeht^7Sq)T+DOLnD9VRcQH^G|M;QlIryXnauz+=jZ46`1tz${r&ygcw4*x004dr`m4ShUM=Hd_Kgh*a&rgz< zg@Hp{)5j?|z{E)3O;e1Wfn7q=*U{A?R9nYWQ8XP)u$FDp4pw9@!a9ACTTRb9}0>WelYiS{`btBbM7#PVZillEL`XI z-xuTu1_u7gIty|P=|&DC6?A+VnM6KA&La6;1$UWekjIecH;HU+wUkGx_;bj+h;c1~ zmB)8Xom59C@y|AmlVwtl{mB`NAJ!wH#ZxTlau+8kr7Ez6mr06(iyWQ+cGABJfJSSg_Db_Vr6GNH2IJ2I%p1BydD|sF6 zJyer!Y;06lS65l|)=BNmBR~C};KRsA#B&@^c6WEP7K?==6Hbw5e^WIklGXm)%rYPd z922;l6)yx6!adcl48C?Xo6R!8V9-XrB%=PE1iO$yGS=SSo@i@pOXGJ^qnW&9vv6km zxa}5r?bX-8|HUT|@STIpE6X6?Q~{#h0WnqMvv?R!xty!6uFkP6Yb-1*NYw5R$gi98 z&_l&|{2s}cmX>ff%`)g+s_636a$G8~40CQV2EC_Vgi|lQ3`Y;& z4x+&Q0jKBSlJ83>=ms!6%aA?A{rHwrb#--FVjKCKd>NwtCUT3*xB;2c>;E*=b|ElE#oavZ1Au0Sk2iCkJ)SrLbZhMb!h zmpjEm4nv-tUfzEYB%a$5GDp_rH66-jv9Q_3>C>lWv~49CM2iTA-|x4LkB>Ww zi@k2A%ILbG>pEC(Z2?J=Oi#CfV`Pr3A!{3PPjNr7H9b9TC$?!Fjuq2ljV9=Wi;Ihr zAP7cfWn~^y&&cL9_$8bcL9hW=UJZOU0lbm|p5=gd9RSXYXSLsef(G1QQa+-)-(K3zASX#Z93CEaVu@l%l$|(qb1D$c3jTEzwUwgV$FKZ|_&PoN z>?&DHx?^Kwj){p0nHKSrG(vZ*G#6;my>Dr0$r=iUSWM!4Ta7ED<_j<%$q48PW16Ax z7+77kW$CBxs*LAUl^GlybYd}g(5vck>?Mi27XV&BKDCwNe zP6gv)Fs_)9?cO65yzV`!U10T@nHei7-ly|DN5&8k#A^eBtfU{_KU&%|6lsA7yMm-0RS26=-R-J{xkpp002ov JPDHLkV1nbBU^@T+ literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/showAsTree@2x.png b/platform/icons/src/actions/showAsTree@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5f301ac90a556d712c90fa79f6a8a2da57cb7538 GIT binary patch literal 775 zcmV+i1Ni)jP)+ug}*wrLYZ zsTVPa{1+7~-bC=A0YNATS|SQwG=D|JlNMt|dZ+<0#iL#oJb0^k&_iw>MCvVH+hljg zH=EgHquF##+XVH&OLk@_nYZub_hwND0kaehW-LbBg@r;P*1FU4Kf*5Ul3rc8zg3-@ z2TW6gxjEg}WKv^>ftAgBm-GAfKuE?V&5I*PncTSd_+0_5hQk^S_vPl@OAyYtl?ShI zQUm;mM9goSNxWjEbbsJ^0*nL#8VGjF^~X|NcYhuTsu2v`KX3z{e_Fs_=gQ^sKfr;wayI=k78J>sFrKxe&<#3^KD+DvkZ)TCEm`1J#SCzUR$kuM8dHK(pyUv*ALg<3YIX+<5r< zHx7*LO1WHagTAgSLn1lAxt6ySh&)al&<)UNE89lOeo!0`6Xn1)nb3Q3z%N7Wmmuc= zx~7AZ()u2-_rZZ<{*Me}!Ev039FVRaR3fnmSb`LA2v(CC;IHSLpUh^nXXvsaA4tMY zWxVqda*NOcL801-!+}3Fz*LAO$3jZYB_!vR0a87sJBPsmt_+YHCe=nvm9yNubNuU@ zZ3;OoTJbm#WdM#T!;N~q{(*FBM5QeINr)J9L*_W5@_2O_Zmz$r?!^HS(}2iwWsJQ) zm-(_}@?IG_RBo-NM=T%?bcZ=`>*>3R&jXQXvrHy)!sM`IS%C+TI6(2yJmP@XZ^x5z zU~K(MNvG4RqAmIx$w+XHbRLjLw1M+%`|#Sa8T5f64$xVEu|Z_R_hTDC2^MFW``J2w zTV1aei^Zw8<42+EwZHnsWNPngGxxyE4Z#2Y?f9nv0{|NZ5`rlHa|HkZ002ovPDHLk FV1fm2X{`VN literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/showAsTree@2x_dark.png b/platform/icons/src/actions/showAsTree@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..43aea857d13848ec50170bfba2c189d818bc5553 GIT binary patch literal 781 zcmV+o1M>WdP)%oJET=Esf_AI&8fFKqG4T^#n&8LWX(rRoeJ(NIcil<<2Qo)0_dWnY|1urE5Z8qH| zyF1S8&Tcm~8@EZCpgwr%%x37ky!pT1n?*_~Ow%NovMEs)R;$%W>zW@{gDLGYzrFZ; zt1__+Xqp5wGqU6HxI`2M%j?f>=0?syzy^tC69H_vT<(w9G%g|&T&~+2^mIa-T4Z*f^ z|K9h)*FU#rCzVkv0;l( zIoyQeO~C7ypbeBA)m{`1oHPJUD4iu1lHys6b4~=n-4?!g8XQnX0DQx^*ocU7=9_me ze%szh={3bsS50`f;<0N6}SVcIN zPNzTFKV;BUw+u~IZf)Hrx^8X0&d>FT@6pP~q3;7>41h+XF?(5sYl(!H0c0Ft=Ofun zxRT$FhvmS)`giVw&1Qa9VAv}`RYi6m;8(OG))~g>wPTG20`NJ&?gB10(C-%~4uA

Ke!UMds{6K}__0^_B>`o&~o?`u=fz|;f4|NiaxmjD9*WSSRlDoApc00000 LNkvXXu0mjfb%A2L literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/showAsTree_dark.png b/platform/icons/src/actions/showAsTree_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..90a124110da92bccf1d65fa0c2861575b62c2847 GIT binary patch literal 452 zcmV;#0XzPQP)j-#`B^{r>&WC8~4HYmhh-9>f15;mrbqEDT~|tPDcJEP8x=%&*qeg#5?q z0yMw~W3Y2D{^#Uo2GUFnoLo!{U%xOh5Muxwe3Fl1`~+otdwU~n00m-qcQ;%>OG^vc z3vd_wIyL7%D;q2f{=0;Gdzc2a-;yRx{f1V*KDhk5@hCLpq zU`~9v=gg_gK>AF!Npd5SlFXZecN1CpShxKC^t%(tZ$vS`WrrCfHW$FaU4zFe26{#@ z*MDDOcz^g!11TNjB1?CR_qeDLoyzUe);{>1qOD7+UVeS=&;2>=K% Y0G3eJ7|Ru6wg3PC07*qoM6N<$f^1o~X#fBK delta 440 zcmV;p0Z0Dx1F!^;NdeN4NC_2CjXTQ2`suhC`rzUU)}>&zL)&oJfX zEQSl$FQOR0u*c)nSB9?;_R%wEz;w1rGB=Wv>^m|Kr+lgTpvo-I+Qw$XRgYqT%MLSc zY%Tx+plwXdhD^0u+S(G=*sn5tUiS_ZR{zmma2<;aG=Xsi3g9bR+FE}S_a5D6_$&0E zfytGf;qT$!)#xtJM0WwmW=1cDOkH&y5s>Du-+{jT`jz4S$GZ$NRx;<%U9b?@1xyS~ z-Im-&t910xG~d0;ARr+4npc9~2HgemAQ$xiWMEimpwDpY`o*Kl>N=X(G)qcINq>3y z`8N}ieo!L$&$*WAf7O2$rvJCwF1KXgY&=;Hc7U3|>V2wC3lkDeRUUBV|0{`;bjFsW@oJdZPupJB?&Szv(+*Dn%wz#flN z$Ugc4#2kmz|4uP4^^xq^1DGEEWv9dD!;`+|; z;pAJGTqFN3j{hIsel*i81YYXA%j1^jaTeg?2c~L9hR-Tr7`{CF&cJ*fuB3@=9rZ&1 z6zmMw?_TeeP?m7!;^YEb{^HF`h8M42FfeE`GW`Dao8kYZ-!S!I)C>V|oZq;2vrCX) zs8oPo0M&9RcrE^x;g8S{2BBvH48P_6F;X)GX8v{Z z8bH%IWw@SGEd>6%vm^*A3I*cwIoxt6U^C)e&+?Zoh|&<)2n>Pi;5b*42qfrpD3B1B zT+jZOJ%}ph!1cQ~I)QOsMy$_~EvL9Lx_t9Wlema@nIIqWmb*E-1yQ9o1eWJ@?Ck8d z+`wRGXJaSE@(t*gQ*otWyF5!#;1L2DCEK~IEEpI&GE{q~(9jDbPu)SsUR<})xj z5U@NAh&K`29zbt`fgNz`)-8ww7<3u_e*UfvlQafe{*ROUK-c}d4tOkgCl~_gtzjhb z|48y}4|{IkpU(M4Gu1`tCnF;RJ4nz7=m?u%tS{FxFo@%@oaNxIgH&k|y#xa7OD|tK zGXDLyKgo{Q3g(C`2@!FIKYw4IVqm_HZaFoZWM4mj{tPaOwx4<7$jI=2f3Ud_)0f}O z58nP@d!X=3>><-<&bP!`PF9=n&!0cyTwGlHd3kv+KlvqodHGGT&rm6IsHKKLtVVPj fexSSO009O7+*rB%DU|$f00000NkvXXu0mjf!HT2C literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/showChangesOnly@2x_dark.png b/platform/icons/src/actions/showChangesOnly@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..26234ff61cca3299a45fdcca3948b9c330593af2 GIT binary patch literal 954 zcmV;r14aCaP)lro5a5W?#5|k**=I4TwWX2>~!D zVQ4~5#b1E<0}#JuIK%J+NI!z&C)p;+O9)s#^N%@0rowO8US)R0??C?Q3k(9TWP%{mH z|AOg2e)S0w|Wl!2VZ<7@q!o!eA$8!*KJ@Z6<1lz|5n(rxL_P!~)TM4g)Wq zKWBLL;w8f?U`T*s{tMUFr&J4pV|=F*nT1#aaQXb@^A}*tVc;Ie!?kR`*g_}`fsMcr zxDJf-E(vk*04`3b&q48xX8Fq(FW`Jh38}Sgf7n8(QV!ezCOBZ6mk9C;LV_7&`Rf7d9Kn4aO=|4XY%x7S5AYeI2 z^Cn`eWArB26m$iDKYxc8=*B?H|8a63=(>N`0gvVG1VaG5HH;(~;6EC+WTB&|V$1H4pVzNN$U;g;j;yZ;Ud zODS8z9FZv@BJuyv-2bIo}d%IXMnsU}N|t{_(%y{`dbyFF$xEclqHP>CaFpbEu_;K&(b|8-Ad> c=Kui)0N6^vOtgLDQ~&?~07*qoM6N<$g3z12&;S4c literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/showChangesOnly_dark.png b/platform/icons/src/actions/showChangesOnly_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..d89861a28d1d1bf5a18e93cd8495d95f3883a94c GIT binary patch literal 503 zcmVN6kPA>0TvWRbXY1e6{14`z z0CSx|mK{EP7{dUDv`-~4Cq862!*Cf$pUE~!ZbVX&`OElU;!oyZTiE}ybprW~CtV#^0vNb!@K{AhTPNnp<7W)Y-xV52aY6Hi>lf<{^z@5gym`s+;>!z$m)~A8=yU0m z66Jz5e>d?NXzJ&KHNOUGe({3g((?-p&*YzfHzhICQms%Gh8W79~ zN{PS_{f`_A2H#dNEHuz(06SY#zX6+OS7+DYgS!r*gaJH}T;PgeFu(DsSw!?r>=iW4 zQex7ZT%28k(bEAVFqJid7&*!Z>i%#mfSC3gPZ(;YnHUaqy?x;T)+{Q$#rm1)1eDZ; zBQrTCD4YuA;1e?evQ1{cdU^d2Bhx+W=cb#1{28YtE-+$Ci70@F`CG>Ok8c;e`Y$&} t=9}Jg>rb3tfWmt*(l^KjlmLJL0{}|Y(BAWybu$0}002ovPDHLkV1j&w+|U33 literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/showHiddens@2x.png b/platform/icons/src/actions/showHiddens@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ee64b956c4c0572d9a18c523513180fb12fb6dca GIT binary patch literal 409 zcmV;K0cQS*P)CI6troltjkF(x=a|j3NR{N&yQ?WgkkZ;kbhZ zr?j=!xDEv7j=X1IIiNDwIt78@R?vyIjjWDAVsQ=(9l%6&^4>+~#>Hd9>UKdZhs{?^ zc~qaxoBOU~IdIc~?Y4ljMDNPBil5I6&}2s7<+Xy{&YzvrN#J-SfS*4c&|~UAhXBIU zbLn-UY4{g`+=mgf80BE?Ngc?3XWvFZn2h?p7qhsXI{^YFGV-f*?=f|ty6XV@cR@RE zWJ6QjPeHh5=KvEyNNOztLNo;e9HkR*fD|(Xa)7d)1#MnFzW1sBi#`ih(+{|us7_Pu zXbzygnDpB6S({SRmS1rI=XT_AFIXG_{P(xxivR-vON>J4wBwh_00000NkvXXu0mjf DuF14J literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/showHiddens@2x_dark.png b/platform/icons/src/actions/showHiddens@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..0db52cd5c739390b9e168eda6afe8f51f31cf431 GIT binary patch literal 435 zcmV;k0ZjghP)CHJwlJr ztMmXp04k?R#0}W?Dm_ZdCQ=kUQ`@zrlqRx`&8O-}1A3MP!}Ig_fy@j`Mg|K|*a6Ah5{HcLmOdl`|Al%*O&H_#+(hMX&jEGn!d8ZAf0Z;W?e4PO%A=6zw%a^OU z6EGmZOt_QHJ*E#7Hwz&5F3|HL4NZ1?3H&p;21p3-Sz5&a3o!))6qFNaK-5IwsR5Dn zEYRz6czT7yh=+|i3s&O?(72geWdsh^fVN~8wtN;lZn3mvzchez7qU7>#4|IoyeGte d|9AW)zyL>BgR8;@CN2N~002ovPDHLkV1k{yuqprm literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/showHiddens_dark.png b/platform/icons/src/actions/showHiddens_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ae045498c7ac899863287b5a425ee813ddc6b97e GIT binary patch literal 313 zcmV-90mlA`P)){6gI1e@_MwS&jMArEV~w19fuuxANnBT0QmWQ$IyoC?1Q=%nrl~iY(FidN z%_rbGF0rgabaBzXf`fRV8ZaVSdrd4#Vzp5cT@?WgQWG=%y=fZF9hYuK1C4+gF-XKT z2O56=>mRJB6LQ$mPZ?2rBqfr>S-XE2k|bpA%ywU3&v z?STDuQ&!9%{y8ZW9AaB`-YGbBGXn>mz(v@7?a?bn*%qGw-r?DBK4+2qSF3KiziT0I z5u)4{&~%FCQ#2-`>$-!ed<&%t9NXC>l`I*MA5KbMKIlt{zzOWScw;jJw-)02>43#( z%!D(LDAM{P_f!^-ymY`Br$QlsCe-FNqNSd&R0%>rh<8IFz`2&7l#%iR5<)$jI^Ovu za4X(fA>ly;2p*E8zJzXT;@P1Bh%EtCkL1Af4=q0~c^uYuJ{%E|5N;VEomo>qaw zb3;9E|2_diFJl=Ys$@!jTjq=>Fd-+FPG5jjMMG&--Ei;KY!6ED7(Q+U>fu43&>QAZ o3AeG&O!psn{eLE`^!YBp0NFcfmksf@MgRZ+07*qoM6N<$f-8e>D*ylh literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/showReadAccess@2x.png b/platform/icons/src/actions/showReadAccess@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1ca2c7821e51c079ab43a327fb81df67c457ed7d GIT binary patch literal 1401 zcmV-<1%~>GP)PsJ;kAAdxP@OgFN0a-}Jxg+(7C zrxeSV2vVo>zCHKldF^-ZyyeyHdfgTFr3=4tp8s?1{=f5o`TftOzVDN%{77VqKT}RX zF8A`bw-;7+3P~bVlGb8Leb4*Q^Spw6Xv5*^2vkxYlv2XDvQ!P}o5gcJl^ynSR;<$6 zDofy+41{wFtc|*Gln3=)jT@VI#S!T4?!M|}3wdbV zFZJmMDI9Il>q7U!5uq{@Cm#z8)=Eexy5lx^uDb=Mr>bp3vFC#l*1Gz-RvTPh2s<3Q zsCvh72Z8UzT9DvjgJ`v(HMhUl{Ax7>G+;aMQqj;KKGcf5uLlU_4C(NRV_C!5WV#J# z5o=+S@Qz17q9(AZ@!ba>pA3OIAO^G+4Lgm4jY?2^g@^SsL}5u0b~|s!Gx7AY#lJ+) zr_PR!WD@2I*b?HM#AO1a6w&y+VdJ7ZuZKWAa0qBB8ouD)s!ZdZazOi&Fm@VZbJnq) z^SM-}Wy$e*!(vZ1ZW8lC@@OudS&4MGzUUO46SX#Ifb>^$-&!!M5(0wh55T;Vu460+ z!8uJR`OUSRQ%=tMJD<#SEg5PUEbf7wzTu8<&GuwqCga=9#LlyNfiwCv7XwQ8{ zIUQIEdd%Wt7N4 zm2f9`HzKp`mN)KcJ<;={eF0cs9ZiY&c4;&el~v_o z5o-k`RNH9r9A^{uufLLj$PcS#vK5uvcRgZf^Modt$5drRLR(UXfu)RT1kyKaycE0% zoCJh;T%};WbU@e?3?Gj0*Ft%eC;g?rmnvtecw;j5AT8}KA|v@@41MAqz~7FEim>-m z9b6pefDt%v!bw(03hR(mdE;kn-|{OQ7C;I*Ag@N=H%OW+oT5Hlw5&CZB5ga~HE5OV zf&;)J;8babi7Bb9o*8_O98za15q*Xn)ZXu9`xgI~f=hC&u!Txk`vjo>ij{4TqHC57 zJ->gX5*;`O+zBzM`Axh=pP_`*9owY6(P9#)Ort!c_4A0% z8BUMVBq%z|PGwtCbq{PM-_%f9 zieSA**knT~{C7AfwwZfws3SHwnOR^0PXL>XhLz_Y*ozCtR$n4vB17o{oG3MV6lvLo zocAfU#;p>Z<2`X9MCgWhhMtLSo!pJ+lE48kUT(0`*&fQJxlB{q5e*^-#AyS~W0O)5 zX+SZ$#LYQ7^KtXF8-6QZb)ng}l9^7|vXA(M@hd^;cmZN9Y);-jf{K6ok9FVs*HEvC z-_LxxVf-&aRFHq7O$$s%H~fsYoLwTxw)>Zz$lW#k!r^mO{w|o{LI$OC%{<9pG)J6N z_EFDv5;(RH0wUJ1J(9neK37RJrOEggQS%&xIVDJBes#?JY7gUAz)9y<6>Mqi23*U_ z-;0SDw{|KgE~9&}cb%95Ry;Q#Y#>t+0s8-s)2Sx#j{pMzKpRQ(hu)0Z00000NkvXX Hu0mjfc?FUJ literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/showReadAccess@2x_dark.png b/platform/icons/src/actions/showReadAccess@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ad587ecd59a7c3869923dc934992036a19b1685c GIT binary patch literal 1311 zcmV+)1>pLLP)^`5d_U)Wf1G=<<2dL}4i4Sn z@!t_Jr(?kjfVx}#KRgjRP_(0bk*La_F0RHsd&$qh1h^8c%f; z61UVyJ@TK3@DX01J^VRo_F(dM~C1%k^D_N3y8 z21r8ifDutdmJhkqEgcH9J*-SC;UJL1Vs+mOMVx&RB zYCsUl<7}%0M2Ln`X`ALYnBJTzfW?QO$eS)1)@)uRgB+A4<~fAPr5*v{%e~PFYz6!Z zV9n#Y4z@1X!Z?C4rU+vnbRM#Me(O)832(!=rU9~yd7qgBCC zKq=r{Mug*>$mjD4ohhhd9`VZ41-JCZy8hOMnG4+4GWSv9k=_O1E6vIL+mOhG33#7*y|Ir4O(iXYXT+!9DXm)BerpsIA3dS%MP z?%~2mkaQ^{ny4D6?FnUlAINeUxd8hCOVU~X@-MGfKsN7z=pEUdqii*wF`%8H7q2E#u|ylDTmdhU6&OSaE&^L| zm0!9k31XZBNoOU^gZgm1X~JJf-YjTxQW34zN*O_C*B{`^v( zGimRHf!!t3pc=l0vdp`hw+-ueBb=NYsz3hsq`nh|>iY)GXyOUmFvGBI)_D-KfvXsc z^9lJbI9u2Ey&2bQY`Aq8%$UBMaZ~zTz(&E_CG~Iw*4ecuI;Z@@ph*^0%8CF002ovPDHLkV1iCRb}Ik? literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/showReadAccess_dark.png b/platform/icons/src/actions/showReadAccess_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..edb46473092c5b2789de3ee710a0de7827e1dbab GIT binary patch literal 573 zcmV-D0>b@?P)Wv;Ak~QYT4hv{~FnNIhon`xE8B6Tj?Ul!eSt{g_+u|U3vh`Ym6Y` z>-&#Q9D+Py%zPYL%s+oF1PU3!3`hdvO+ai0;^bdybzo#q6FW;LvKL+gu@ew)0CE2P`}grb6GJp3D^pqa=?1X3^ z|JV2LiPy6CoJ0@AuRt6E#1khQ)Lvj>XTHtK$6>?D$G#xUdR#NS`PXZ&aSzYl0L!++*~ z`+j};nu4x|kx*t*nrJShEKoU00000 LNkvXXu0mjfLR1i4 literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/showWriteAccess.png b/platform/icons/src/actions/showWriteAccess.png index c6bb062ceef9497b1f7bd2cc48966588a4bd6aae..ca39dd1b924a1ee31b2ea5bf78e9d5869bf15f31 100644 GIT binary patch delta 463 zcmV;=0WkiR1dardNq?|OL_t(|+G70w|33pIfQ68PQw|1#|Ctz<{rUSp()!?q59snt zcr`m3uyJs(ui@k7^x$A;TYJb(pAD-Es;jH98W76HHWjGZiH(hwfraIl)9-)(Cjo^s z2)UpSBp!HjhdVbXyCyq3+cy?w=4_w~zVUE#q#txLE+S+=A%76B_{=Nth>?kD=g;4N z62zA5mDpX1d1B$;rpg$-WTT07fJXj|8#T&vKCs z`2PEM`QLvGT7S%JEZE)E7pX6Aige*8*7 zSHnmsGo1`@6k%gyTm0?U?-=V1``(gl03pD{Kp_AKFaYEXQHf002ovPDHLk FV1nelc1#1>o(lBNe;zK5uH6pCe)tRkyMB+B#mpnZ@{4DyS*`{ND6QJF z?C*buMotb+W^OKy#oO(Sbde4CkAz{s_O_VpbYxRMfB)IU$jo$&o0F4|os)ebvH^@p z7#;~?ub<^28-MWq_wVw*{}{BG*;u}@va)94^TGzhOUILRZk&&_KfE;rB(TfTIDnOv zt?eHZD9(+906>5N05D{ogW(hFZiCTi z(I_G@DiYhE5Rx_*OF#&1W8MCRvNx<{>q0 z@q$972u2YJzNAgF+1c5d*_kgk{1WgT+ST${>%4&|2b3$K{oSZWRtH= zH$Yv_;_te)5t%TVH9?Zwf*X`j%3j2T9>(HG919XJtdolt-@7L-RcAn1a7u}$sJl#q ze<;5kFZkUnhNB`DE5OA@q@WzQq9_m8raoMow$+TH9L)YxW?sdHi&oYYtrKJ_uGusT?{1Rie)3B~mXrIZ77XiLg!Fm;_!#y|x|3|%8> z+q}!t`6y*nUj!Fxk#JyOU~L21_au+qlNoC2+Oe9H*=_@zDQqb{^4-E*Xp5Fmh@*Kg zcuq)G5?XNtj@-D8Yw8+F1E`Qv`YJTw zRgBLuO!?7!;q=zDWxSp;jX+hEWI-_sr*fXZ&nfu(i%~Qsos~wUEQ6#i^Bql7o|c@c zh67JvoWZym#B&s;bbU@6YYA%1p@%)}3jI**r;5|v%2DMG&xT>fv z)snCcDUZ@l0Khd@H9kf;n! z(kbh9RLj^{d$Uz-FSrf)93Oh5yL<4VuI%DuB&6yI5{40R5REyv@UiEIAHy@+wJnh0cB96!}Qk+}%VZkg!Xb7e_x7r-SNSG9i2 z&<|^zC*FgOAZj#~_k+EinTeoM68@!z#g2}1nIAx`dW7_?&WW*y$#QT!R7GjAE#uRa zZBfqQBPsz^l0~cTZ9RE*rqU|-QTM$aJ14)Ih05J)aDE5^(`*|0V8^*H8zr!`0n&UA z@;sWdOp9|Z0f$Tn@Vu{O_?yd>Zb&j1&-l9GCAF*v_jP?VGSj3Qu*D1?|V?V%{ znt=PoXawMIOJNF%;l}NXN17iMdCxysjN=OkyRJy3Lu)osCASfXD}U zyvq55uIFHq+0m4+9iErAUv{bvWIGSyHAq*)!WInR(*SOrbKGecy#XXl{_UUqsoG5` zUDEx6Uxd`UGiW~hA`xd7!O;cth)xekH;smrtd;*(leu-LK+w`oH-gMzyG63D`-|%b zPr}Oxa}hi~kjob?p(RVMl+FgU6rHLMCX3*u^8ut60MZD`3TI+MUj`F7_5>p+$)r86 l1-@<${C_z8FRp(C7y#1eb5C1?vPb{`002ovPDHLkV1g$RgE#;H literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/showWriteAccess@2x_dark.png b/platform/icons/src/actions/showWriteAccess@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..64a7bc6ae62f102c0e036080549f009ccbed53b1 GIT binary patch literal 1373 zcmV-j1)}hFZWd!> zi$)QNRgo$p5-eyy1fhhcjbdwq3Ki7iCEieLQvtS_xq*;I_829UvMt!q<5cWPQ$bQ}Pi1#z-gsQD?>ch4H3R;A8>K{3)H_Urzb#je zAO7M;aap9|yx?NdQUGv8QLeL1{Xl!sRxc{p3g#cGjIE*#u%_U&bpr&z8Dkx`!ADBA zSu%A_41<%BWnrn0QiXL$pl0AA7X!9%=P3v1{r zZw8(=BVoB*o-_EeH?~t#*FGo}%-d{$GlfluT4Zwzd$BFLVW_@Tr7WU zctz1No-de2sH#f#K$OHMYJRZZsRtXPBsn2DCXFaq1}R$R4oy?;m7HmS=WUoP2kyo= zgmE#5=O|3+0SA6WU{3?Q0`R_5Rd@1K&HdZ)gEe8CR-{7UJt^1*wM}E6s;J%A%E0s0 ze?BB!jdAqP!Qo4sAovyDuJgn2yP6;Njz9R!c&+Y}n&*=OwZP)0%;QM4?} zHuM8XSEtA+V<9S7DUCS!$cxvXalAiHJ6`_}4?KNX-iVVFsYnSTK+d}USUm`z0tsb> zgfciO7OYF5mQh5|lIdur6fXz!#(sZ%XanX48=HxkQn!c`;vgE(4F4tjC2H~>iN$GNjxf*!I(k}sSMj( z%Q@fKaxd9yNAcEu zGY_4sb2*1fwqk!%I@K_7Pufhs#Ms=GW4Aq z=b87C{V{5U8-#1UAPg63z)9-YZ#P~a{u;#UL`YxKcMsi6^5FQVDoVF)8SfQri*k-2 zLkUnx1+BWT>Ufj>4F0@0@C~h1*XetA%PMy@^!*SFSc%HlD_(oKH=^VxnJe783VALU zEYsp#%fL~lLwMd_b-i)OlfB zJ@7KYUILFd)!h1VwB%{VlmCE=#rQChIZXi|ji9W4C?)g>Fp=X-Fak+t?fF9BEpg!g fkJH7v{t;jR6aJ3AV@EJ000000NkvXXu0mjf2FQMY literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/showWriteAccess_dark.png b/platform/icons/src/actions/showWriteAccess_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ad307bf18842a06c7239ab98c0f7c4df18951770 GIT binary patch literal 528 zcmV+r0`L8aP)>Y z7?=I|`#;k9;Drz9@=SO&I~uTYaIml8U}sx<$WEUPs|z-7-i*}%SvIz*K+R5U zY^)3{EWez7|NB1)D4apa1$`iK$%zf_+??#1?CfmcSeTi!fiC#Q!_AR?(8;)nkO752 zyyBmP^dm+lrky{3|49&AvSS+1_EZjb_WwLw99_E|jQwDW89}jt<^@=^9Ok`vD(hHM_n%FS%uLs~ zIXU^*IoTH?dw~%N!y|$D#+6)T1HS+MUH%I&U@Bx_Vr6Fd&&agcaMjK@qEq6pfB!O=nOXL6 zaB(m&GBfY{^5a(ux*A48ndxMJqX-)t+v0D(e#cmE*!PxX0|)^o1_}W{fB^t8hn?1o S{ei#$0000LKj4$39%6_ zKmz~KXnbri74tL_t(|+G70w|33pIfDvRsb#*m}O{z(Zt*xyLOz470G$A$^ zu%H?6AC1Px27`fj0kQ#^X@egPcD+@^m{Q2`6 z;R5#$2SL_nkm&ju3=D24VKAL^0~kgV5-c}T0ssOG0H6FUsSvZh69NDL002ovPDHLk FV1iz;KV$#^ diff --git a/platform/icons/src/actions/splitHorizontally@2x.png b/platform/icons/src/actions/splitHorizontally@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7060af39d5a4367e3034281c93df5676c3247b3f GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GyF6VSLn>}1{rUgj{;&g+S{oyq&WSm%US$cmzE((N5nQ`= zZL>1V42~TlZOa1{j#;d@eBgmsOU48HsYl%|AIOk8AkXwHH(KIbK{Q{NfXBl0D;pND zOUpVXitW&Ac*eJb`JbVYp@HGW#u!@csDwnqQgOK&r;>E&uXDr5L`2cNARJiYDi5aWsmO>^1WM+b6+sz~WK$aRx>< ZhGX@PbGe_rE(H35!PC{xWt~$(698+6ZAAb8 literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/splitVertically@2x.png b/platform/icons/src/actions/splitVertically@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a9d3edfff0720b7e97475f6b6761408c3f27ec57 GIT binary patch literal 376 zcmV-;0f+vHP)< z3kJL(!k-Ok9|ixB3ZnlbvLFI^8W92mP#66F2f;8l-J^g&8lXoM;B~+VsE!GwfuS7* z3{-FcS^WY=67YO1t^D~UngOwtT-R$iZU4{0!3Jjk`SFY4YMmz|Ip#2q_}(!vf)B7renJQ?Vm8Fb-t%|niK|4!RtBJjEE%bN#5=VX-WAm;#(c_cvYbivy2&3AtWszm!q zcx#=*F!b{I{D1Wycz!tH2N5s~Km#KuP2K<$9UAfZGEqJea)gi8xh)0tSN6qc4G_p% z@)Jsch+-T0h5PiJbFR`NiGYbbZ9}wa*>(KG zn<*p$Tr`%r&^CUOCdEp>0#C>F_2@BtS36C`92vmrkAo@eG<&Tj7RCY1vpoX0oc zoH;YYj4^N*V^*MCF5C4Hq2kck=iR#KkS~==EdqXOop(;)M1PJ`cg2R73znD_OAEk8 z|JJgH-U6bxLfaf+nqK&$Pu{z|#9z;fm(!c=DKrHt13T+oLC<37N8o!tFotw$vP!G$ zt>hcX{awqeR;#<2OlGoHtL@XakO+M2+n(zVdKaUv9&!!8eb?!(({gk8ebsYrq zmi&YgAfnhte&miuIOi%Yk_ec{(%#dl>2{ufQdk84hf+D0jcB|Q4Spc zq&aLQSlg??pi~SK`00|T2-C2j+ R5C8xG00>D%PDHLkV1k$J{y_i$ diff --git a/platform/icons/src/actions/stepOut.png b/platform/icons/src/actions/stepOut.png index f564b7251a424a432e5e053640c24385c78a0a5b..0322ede64efafa35e948b415ebb7c4856feaf65b 100644 GIT binary patch delta 299 zcmV+`0o4BP0_y^hNq-GVL_t(|+N4vxZo)7S_Bkfd2g$@cRGllav?z`8DwSH=iic?t z3ky>v#Fm+%L)N}Pmoz#5agLy52;h>FK7IKv_NTkE4c1!LB{=ICqAAieb>veLv>LQ6 zXbF2s3nAgNvDxv$<$Vp1a7WnebVf*A{y#(fA>0y{gb|@QHh+Ut{eSOF4vY8q;AT3H z0}(s{Kt#D*EB(59y#F|R9M0f+Iv)?N!dZV1GR`?O#;~eHR{r9{`ix0E11^Gz=+ov< zFz5v}*P1HwyGR@&LnNj7`%!;!9(fsPZF4F05a3|oTGQI(UT*PO4 x*(9D-MVY8deI#jA(y`OobNudg3SD9=zyNcicDSe#-PiyC002ovPDHLkV1f$mjFbQX delta 302 zcmV+}0nz^J0`3BkNq-PYL_t(|+N4rDPQySD-5GD3a1dAA0Z}8-05XxU5($!^943j< z&`=>EI@c5wZn*$WuxCHc>?#mPGI)_kdU}52-RJoj>be$vLN-N~WsX7|q1B-6Kua8b z00S$H8PAQ&jvrk<)PNXQjJLhc8Dp2nf6VKXalv?ETr#%5&41vp{y+96hr{1%JYQ_m zNJe)6kZ`Ur+RR@j*Q?HTID@mr=4NyfuZN>pAfm9=imD`0e$nk~hl!s7%4jNwd^wf^ z29am4xuUQi2_dmeO4*+m{s}P&GBBntlrpCP2LsodF}CP3@GVeDGew#!Xn-|U^bll_ zPt$d^Eyudj??xLFuPumAu607*qoM6N<$f?OSl A2><{9 diff --git a/platform/icons/src/actions/stepOut@2x.png b/platform/icons/src/actions/stepOut@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..019572fcf14bbcfbd2572ce54b3571229ccff82d GIT binary patch literal 658 zcmV;D0&V??P)tp^s%BxOr+W zXcF!gkuU}32Sr5&PV%iHC)ineAp@TOV|npk*MWh(V5;?Y9O@o03rqkS_y(-GbN;b; z`yd#B>#fzhjImc-@Tw4;@SM+En~^mZ+V0_-`lsfdZSMrGF0U>K$zQ8Tu_#uglq3+z ziidgEpN?82r;AL z$Z4|0Y6rmuOh`e_mUBMq?LNSTm|&cfL9&tk{UylRVvDYLBjCd8+!||3W)I6rcq4$& z{=iYIm05jmZ}aW=?vH@6?{TzhrSDmefVG?6k}%a~MQd~5wxA5OvE4M)8-5GXghyJZ$F&>;=L4Kd$Qg@`F)AU>KWhcp&Zvc59a)r;$M+?^lls^+`VlExa4*S s*m2DW`~IxctcPnx=l>1=wHygB0IF3Za!b0op8x;=07*qoM6N<$f)TARJ^%m! literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/stepOut@2x_dark.png b/platform/icons/src/actions/stepOut@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..2049264a81d3a4cb2b86738857bba31f652bfa9d GIT binary patch literal 661 zcmV;G0&4wY|YRg^Co5Vns?x z0+GCVIpay9DH*1eCg}k4ncm9cXKw^9v|gT(N^Dn7#nsB`7{*m@oFf96`$5luL<$1? zgCPy~hkeXzAKOcbpR<6|vWitTf^iusBEiVQu+A(Q7`Kis2+4|~*y+UbT*m0Sx5G#X zF{|RpNwS5vqu>H2q#&ouIiK@(AK*evGtSAN*vKA#339qf(RptKTzH*XV{OUmVL1tJ z1Q6P9*lM*h-sk!@Psdk(1dQFl)~c1hXE_4au6rxORGUXyn?09;GSJ5M(^S9p+lU^l zEuq4@B`%-?o#-oD_ZB{RZ^f4$zG6jH*Df+kgN3Z8}gLyox9T>{{1`aB#A%X6ImI zU}9oo`1kK0!_ObT7=C>J6@G|-A>c4zVqtDzVFzkvV_{%qWd_q=KF~$PB_t+B)qgD>w3+4^0!dX~Z>lqmtRDeQv{`~&kc(NgECCzgqK!5=Nz+H6R?pfk?00000NkvXX Hu0mjfMempN literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/submit1@2x.png b/platform/icons/src/actions/submit1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7326d03edebf71651d9564e97c7070d84e86285e GIT binary patch literal 377 zcmV-<0fzpGP)&Vii1w$^h{;Am)eiKN1_p!a%$UNh31ghZ-sa<^KiZ2vQVN7oCk{KKp=jN#Q}GK*cXU@kej9N0%ai zA=zcc2_Q~_digulrFTdwHt_&ZBxwNg4QSXhP|IKts3p6ghZfS*uR&lX|Ddn)00ImE XRRJ+d+YSwE00000NkvXXu0mjfP&|@G literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/submit1@2x_dark.png b/platform/icons/src/actions/submit1@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1ddfee82f72e49b1c2a719e2114166eb1e41b311 GIT binary patch literal 377 zcmV-<0fzpGP)Xrg=6~Qcx z1VCXH4#bC%ygUO#J)iMgWN2A7l{3U_!p8G$RbZ9 z3&}1kP5^Nd)XU$YF1?Z$QJAfm#NGKrPt?J+zRfehmUE`3HTS2M}NY X3$HTdwN~Qq00000NkvXXu0mjfe>jS! literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/suspend@2x.png b/platform/icons/src/actions/suspend@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d9a1636ca5ae327e1d0426cb0968dc1561d8bc9b GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GCp=voLn>~)neNDS$UwkVeQidtph&+;1>^abtSsk4V@me5 zy-}HQv!*S9Y4gcNwSVk?PG(_vw3DqcPB!85-j91?SNaz2v_ItEklAO{qx|&wu63oX zea|PqNm|0NXWCM}4ZV}kwA->WG+8xh6b0IBU|5on)GDmQ;HjbUl4nbT<1F4aKN%*o zuG*==l_AWv<9ov;KgXB5pUNbBZ8*wQlfrb8>Bgjh;zEw7fCbMPIxHDJ>jb2;#=K|N q=*zuUdSE}NbG`IG+XK-Jj0_3p^K2XLJvjjM6N9I#pUXO@geCz0R&s#= literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/swapPanels.png b/platform/icons/src/actions/swapPanels.png index cb8b10b5172f6174e1db42cf0cd1e50a6f743e46..6484cdedfea3e6d9e19b4a61e2384d2db08222e4 100644 GIT binary patch delta 527 zcmV+q0`UFJ1kD7HNq_H2L_t(|+MH88Xj4%XKKJk4yceQi5!4|RY@*F15-3#a6*1-rmxtTn2lY6h{#TU80CQ|(1 zaL(bK^PTg~IhR;#p@&1|v6Gv#ub=13W0W#B%{aS42+3niU4M7<{D&JWk01dO5tK@$ zuCtU|dvA;_Qbr%kz&|5=35+q&T3gi&Keig-{S#Y97kbH+N(H#fCIbI3R$OO-kI1wS zsKFZh)G9SI@pkkJ^g)lHhB6mb6w({P_5r&9-RUe~)obIc2WRm6DU_i^e(|pkuwNja zfM_ZvH1%fKxPLzJCTF6+KFM8B*Rj@MvIT>>1uENCYW>;p>ZDsSmTkY##rVoFiOsXI zuEzQT41n9g?S$?6g`E)m7yd=C;n;Jrxc>GTB=Kbb@+9S~OeigocsfQKIQ{k5xj`M& zV(DV)`|%e%EaRd|Ih`W(_l@9*d_tXz*IWJbm|PsVTbQPT-K2u&MIZ?eB;XvtYO`pKxu{$1 z+ScV)qXW0_?aszSk(T%5ZvV4Ldx|o6XWHtj`q@0cd1<-P30t?^_+J7H08W3Z_%28x RkpKVy00>D%PDHLkV1l(o4-fzV delta 526 zcmV+p0`dLL1k41GNq_E1L_t(|+MH88Xj4%XKKJk4seh|b%`9AgdmmyTEk7!9bg z8V14Cq0f7M#H*J|CE(Vs8JUhM3h51-_Q7-kDhy{$)eD7%{Zr=qxRIe4N1ktRO(O9G zL_dXVSZ_8P7k|f>4(KRwljJU_>mX{AjG&EP!*-?<1fQM^zACsCt^CD?4hmoQ5^El_ zx?=T7=mWQd>oME)bN@o{U)YLZ&atPhxPI>p;&_y*7AR+BLTQfJ>1d_l)X%Zw{W_>w z>EcY|@JpWX_H9e2>xsbuNDK{tm-eCW796Y^`S{R(PJcX1+)*B8xD@7YNpzW;66E6y z59G59BmZh{JSg$kY(z9ih2VCDd*^i$OOv}$*1 z%je#W^xeYBjk$XwC2z^?$?qcN1(d-T-3caxU(FMXXJ0qMR{N?Ozb?Q4`-rlN#65Bg Q00000Ne4wvM6N<$f*?f(g8%>k diff --git a/platform/icons/src/actions/swapPanels@2x.png b/platform/icons/src/actions/swapPanels@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..98362d31fc30358e3fa9d1958c16eec3e4c23f20 GIT binary patch literal 1223 zcmV;&1UUPNP)oTCI4&kdS6~&vnlD&B+E&)^qljh_n36&h32v_y7OQ{KJ$|)J-{X=CG~?Aybft zAp0RD$ghwE$SaWV^Va|L%vW35JQrx@&}2rRgX(3**peyC=Y?a9SOsUmE;^P~u=krn zJjFTx7IR)Cr5I^)&C*nI6=0md2DU?+?V*`NH>2;oX^G=@sc05bhxiSxGsXK2W@G#4{Z0n@R|GK%Jg&Kw>?v!5Hr=U_Yx0I~}OGAu#pgQAR> z{y5mhGOk5IaM`c9*S%_uhh8wH;`q&0E@hiBFg-oJW#Hn$B^8As`PKUCXpUJ$=MJab zM|K~;g&?>gJ$)H+3g0>lC909{lUJ>iw_c+t2q_(B4_+Tl>e<=Zb{4S6uuY0%c}#;j zl@i%SfSU$s%IY73E`a6ZGLnBuC@jMWmXKH%C)R10C)WaL1r}5PXSl(^)CN3mF`*<;6dW= z9alg#e*bb!ENR8A9`ROdpThT(2*97S)_-!#rIB>|;ors$g7ZD=k{J`#{aNs$zwZg0fvl-zt4qn5!dxw=(smmSsC}_g2mSOin!op z7VTe6BQM;@nRnCz`cA+R9P5-z7^YW@4(KeZDOGE`A$pGioPILE zDHz2D^1wN&&_N-cBvI|=Q0i5I^#(103;JFBKSGW4FPm;>3XF7u{L#R|<~Q{_;XT6^ z)tn^e<6FO&59{9iqbv7kr{$fNeWz~khnt@O_;Uc=W0eb(C?Jd^g-ez1 zAm<^+!@5uI@(rfzKVG=foeTDz9G+@yG2FXs5E!G(Kz{595+#Ssf=%4y8%EwFqv(oK z@i^*LT-&1{IjVA=W^ENL;=lQp9hV^D*(_-v5fAE>fW-yRwI9{ zPLbVuZ6S(B8V99MJe>5LJYx|XsZZ)v4Yh^ioT?%RH;4${HPz%EB*zADk2IJ#EPis zLu=C#ifPMja&zz9o!Rj>+k4x+$!_jPQk-ydcV=hz_dDnOX6CG=wWdzno|F5Vm%CsS zu*YG$VR_hP*jd;+u-}uO|NF(C){U`Lu$g`1>jt&<@c(Vgvi{T5l7WotX}FUaq9qJWTQ)mmJI;z@$b_LGMA8qask1o70L|DK!z)>cQml6W?H@(DHV#VaaW1!w7@`;qX?#YZGk~g)rs`!umD59rr6$g?tl< zHQ*h#)Kw5c0Tg+~EJhmFO*Lnw`?Cz>7=Tr!yi5=s_1aP+VDgrOYaZG`^R@2neQ$IjR+)}@fg$| zg2K(NH>Oik*lrWrFak#^2P~?z3>}Jh-YtApGQte1HNp~1OyOoya12&T7>mWuDlvzX z6<{}1Dp|yv5@DNGxn3rXwHiunJYlj}?<#@%%En8tQv!_s=f-<~RB!VBCJD5QaHoaV zRz_f^gZsy}Fai<480<7`+w|h8wNt)a(|>Y{BVeH-VxKc%e~;t(BMdx}N>+tErC@$z zd`(O+;#v0+ikHy`*!^>t*wsTxQ)Ml<3mPzI0=D4Llw88*H=Wfz+;Lh;wH7(ZtzHG# z{gjVgP=+>YzqxBfdxh;qg=#mOQm+J-8!8t#pg+a+L28tL$?Lx}0z>UkU%mWhylcJ_ zKC@jhDsmnQSaGXZO(|kdTt8i!>VLkpUP@hjn(dr^(ERiv%})dT6@cz=3K@zB2sE>8WSot%5v?aQ9<`t!cmpChN3i3k|a&3@1*ynFz?6)O3tT&*qD%N44Z zS4mdu7j&qeOA}&O8W=qD@Bm}h3rNLdjZgF&unW=Gk=7rCfx0NGKKaYls9KJeNfs#* loFsH`<>lYjz4Jc-1_1TH?E##p4vzo;002ovPDHLkV1nf)Oicg) literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/swapPanels_dark.png b/platform/icons/src/actions/swapPanels_dark.png index b9ffb8ce6d0de7eb267325cd6f9174487b2aed5c..fc717693ab1bb13404b1ecf04e19dba4a89169a8 100644 GIT binary patch delta 531 zcmV+u0_^?J1knVLNq_T6L_t(|+MH8MXcIvg{^zxiDW+;}J>*o2RwzB>t_P87z4#~v z4^ov7TZ2$4wKE7X&qC#e@tfd<6~J`Uy}g0xV~CfUvIjI)~!jGIP^ zAAJ0eo&THvpPfNcO6Xu@`Q(|mh0PZu%O@}@>!3M3q zJ|L8Vl;XK?y~4G|x$i)r3mt*7;sUcQV3s+kI)IR^R;$=_oSRd-rwi))xMDg{pZ%)? zzz8slQ%zBIYJa=8t~+N%xNwi+c8MMY>O4aFLO?BOWL(#+EH<8w={v^k8X>~fol^*Q zBKKmP+5kJUm!Svr4(=p;Js#eVz<=Ri0v|MgA*LR8pFtAy+r=?V$s)pd7*IPW0|9sY zbC-H`P>va4E`8%Awb*F?!9!L1@B!fI6qqT#uMxHtw}0;cT2WVBEP2$=C?Oz<*dTk} z#B5UG-p{2BG1&&9_`JjtgbY;w@I~1p(eG`u{g`wN%pcEVMrH}4LzJ6{aTC-zgtI?W zukwoTw#r}gZ;tgG;m6$j$BY{fjg+WrR{T~4a0Csq= Vj)AUff(!rv002ovPDHLkV1mJh{SN>D delta 530 zcmV+t0`2|L1kePKNq_Q5L_t(|+MH86XcR#h{^zx?#Pcwn#Z@t2gdlRAg@zzTtklFp zFa$yFVh%woBcw@!X%dWZ#Tpy2u#1%t3klk!I!I7_pt10ZG>1V=_Pl+}jI+0^>}_%q z{NUq%?EK&S|I7}OQo#bOa?>{k?LnPC7k^lsGwg!FyiZaB{P)vbY&`hH%qE2WXAEg?pL zS(K6uQFV5H+BIPIJ-u(#t7yc#iKH<;COvby9>VaJd)^Iq+Zp~i`q~NV?(O9I-vSH(v9`8x UDi3`a01E&B07*qoM6N<$g1a{atpET3 diff --git a/platform/icons/src/actions/syncPanels.png b/platform/icons/src/actions/syncPanels.png index 1a639e0d9aaebf8ccd95d6203d2f64c42fa1f526..958149a866f19844ed46e3cbf2d0b5794c16731d 100644 GIT binary patch delta 483 zcmV<90UZ9n1fm3xNq@viL_t(|+N6_BC`3^d$IpEqcjmoeP!=d3`6vrXgke?|^1YL# zvK);hB^wrM7PBE67B;LcC=|^avk=)JQc&?QI$f)5K%(Tu;!&tkUJKuHl#D85u^LluJ%2J$4KHxi53R{ z8Jn%lR}hUxbH+*2<)mB|+~EY_D125o`cuEBy^n{MVT>rRZ&L%Q_U+sPwegM(o{A9~ z@B=N9u~*2vr+-2FP&db(LemHx)Fd}(kreUU71(EE#}v@g889_{lOrNOmJ*oDjXrdlp;SYRnAWw)3;^A{?!K>&i5B1IEPys@ z7()ix(0xM;b909n$ofZGZmX7cRXtXe_kQ$kx!To!HC$>KLk8I|CVvlV%hSQKfvdJ5 z$M>9H75;{AI$!Jw8Eh};UZDKz1D6lK`1RhKSmFWx?Q>Az@VLsm#>vjW%*w*R$jAs%!T?h9_xEpxU*CT+{QCC2 z;zs__P7DK7`Ya?k`FI|%^Kh{F|voL2{-m1Aq7#nHY2b{r%Vc^UK#? z-#>j(xKniEIY^ELW)c$%vl}xzEBn9y|F@nAUEhrC%+ui;KnArKE%&tms__P@bqDen zfL$QpX*`XYjWv^vn}dOkhYRFah9955GW`1TeR}iN2|CMzoGXv8LaM=8me|BH+ zl@bFxlQIJnBiIlY2Ik#={{D$(&N7bwFZEUE(L;fkhX0uVOECWachT{YZWY%*b}OLX z;~)co21NnYtbD)^QN#4-KUj^)7xnv0AO(DXxV+6Csd?1>{{DT(w{M?aL42UFEK)GY zg2X^_AT=PhP&M#Cl$ZD+Bp7Dc%z(saz{6L9 zF<=JpqbVSo&%{6>U_s-bA)p>Zo?;g;QktCs0t^6q?6(~uRp|8q0000iykxwsTHJFstrOB zN});%Zc&gnb(8%&^Ud`4W_RmkGh`b|iDGwo%W6j5(bW4T7HdgDys zn`eJJwh*ju2&J6Sjx%lN2FS{~q|iMnbt({ImmwN7VJLcR5E*unlBXDJp=gd}4(3|- z3`k4QrUufaT|1II2!lCvcM#o#+$HrYCqzXmc^ayH3za?Wh_T zqf*UYIkw>4nF30VNuo2>wblT z_LG*>;Ti|%Vxj`2ceb6x{i|&z-Kp5Zi+L(Fx5Mvn2F&xVr z%w^?VVs0o?=3Ja}#W5VYK9n6^%pcZit1eQKLczi40&ng>I@%O!*`rVVKFshT6PTzY zHooVzE#-%ZF^uIHj%5z!lHgR}9$qXQ=3Gh7fd?k8JV=}VvX4Xdkfo2CTTvfQUMyW> z94sIDrhOE-2tO(y&pyTg`$2C!b22yQ=y0qmpvXdOyEO8LyJUUbm6y$`%lWAbo4<$u zu@0^n_eV#vv(6Y`&vH!M56+X5;N~11Tw(!i6H~uDdNv5mXYC<0Kh~(a2kTp7m}0m4 z+ZOi$%Q1*O#~jQBPHtc#hFSF-DE@OcMKNf#X7Mm_LSx>*F>1yA-7lY>*9yN^t+#}9 zUJ*)tgooHHIN$B}C|*JE{LfF;aG9BZ{2Vox>#O`>p8}#7L4WSP^z=-UKdFF15= z{=JJY_Ci;-loi40eyO6d*sV!=v zRd5%jT|_E~Hl1W<-n_r-ciy}tFE5i!KuQ#Qhr_#b&pF@u&bjB_HzSl%w3$QFCJ%ja zGVtcT?Q9=_j6v>$bVIBbHVcrGkja^szB{`S0%CCs`rp{OmQA-1Vp2%CN7FSDnk0ND z{-g(Eg+UNYcn;skemOifyCDL7EeHq>uE|TfVe}ZbMY?4Y<}r!bVmUmiP?7I??^vaix^~{o*k!vTM@GgX&Cp58W(8sfEh-RF;DJQlA!ngRZr!;M z`oZpBk4%T_Hetxl2|=V0-L}hCp@WQkmNaBfnsz1>VkjWm5-257vIP-_NRwyS)&Obt zWemn@+k`8QBeIi*K5lkoNY7eP$wL)RBD*nUqc}@S9pCRCKUKlw+^&<4euXN1D0I1x zeNFTOw&DPEpRBtDy{~RxE{mpFb|H5o(^;?#WCM%2(DQpy&WcxSpu|4nGl}J9nR))w zlK+m6A1)w)t61*z8ZOnZR~k;Gn!j>n+S||;pp5+zq4A^uQ9RE(RhzF?s@E%2tIT6> ztJJ90$ccsL$ua%dXBGH-!M>zRim?XPtU&kiZ6`2)x>7%+ya4^7r6zp2_^kUQ%}ks(E`J&d)eSO)CgR46&bPF5vSgO0^LKf@`-j!8zE}Qu z_lHn53m}C~$BGC0&Wfr1KO0v*M^EI@1AH??NiddC$daBzLn|@6+uJ^IHx0NedH@Ug zt)l-qJ!95|DM<BgR-opakg|X_T*ZdHMIF{f{N2aE332VenD234?EMcyo_neQUy|w3z*pBz3T5ANYR57>or>PGB%$ zv+^cPF5*pB3SD;`jby7JIEZ89;^kXP-Tdhzy+Z$@|CIZdoE#OJ_8u;=abUi-?p2%y zaH~#Dx6P5D;Zb9uPH6(F4FMi6xch#`V`MFTnm{qBIBFeeCTVhiuht*$Ih@8Sw)yQ* zY)7Eb2H>XXlLX8*05?Uy=|4(u5%~A~FK98Q{~`ADtu6RZ5D@?Sf5(3dFaX@yP%al& R%sK!7002ovPDHLkV1h17IS2p% literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/syncPanels_dark.png b/platform/icons/src/actions/syncPanels_dark.png index d0d8e0a80bafbd4f302954073005a64d491b030a..c16a689fd1f59b94ede10c61a1c5da6dc51683d9 100644 GIT binary patch delta 508 zcmVA=i_kSH6fpsgx4 zHaak{6p5(FO&p0_+1LXT;L38P$nurqG<$7}vOh1XhzP1AT3rp3_?>AtK}BYl04`ecXo*l{ zw!Jm&1cYJs+B`uZ2@n;iKtI$`7;&FDHrndLyv&8leqJB*_b+}&MfHkn;Z)AV!I zdAEOiPn&StB!3Mst)|=+rY939#@W6r?Q?p_oj;73IFdP``+i zWT;~U9zA&Ffg2g_be^Uj2xN;aHt`7~Y}`tQ602;HyDh)oQ{EptZvh=0KcTf=1I>LZ zEyxyGY~m9}*ezP`y=gsj%1(2*f}PDr*}dH|%MK^w(RBmSx$_(3I00{w#U?&sgsmAK z;%rdeWn8+H{~B-by#X#mclQ2iKJ4rA$VZc(Jdcg#_EO5~g=&a{!9dQV8eFZNq^KyL_t(|+G70w|33pIfCXJZqu(-wnT4g8k(o)4k%55=BnGnL z|KESd|Ni;Yf1~jDYGn0{$S%;BXkEs}#o5Wm$wn=L#59`f|Z-IiH()-!_GK(SgjUTy}E z8lYN93@s01O+T+&6|_Uw<(C z{q=h~v!Ivk4u38l9!n-pR%J$Jpnrjo&ey{p8)#;DA| z#0WNom5F8d??1nznaVj6|3>|FZDsoZ|Ki{Oe;645{<|3Y$EB5>k#97qjFEmRFW5aksZ zqy&q8MSC(ZLilLOLkdKcGA6uc_{HD}WX=X+K4b$#pqK%P&wz)ogdUCjXbOntGciyI p(DT9>0_rj3DRu!PrP&!EzyMn-pjbR61>XPw002ovPDHLkV1kv~@+|-W diff --git a/platform/icons/src/actions/toggleSoftWrap@2x.png b/platform/icons/src/actions/toggleSoftWrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ff2f8c99c18d73b99624326baf930e6b6db337ee GIT binary patch literal 1189 zcmV;W1X}xvP)2Kby5Z;bdm^&b{aVJ7=g;id;`J$aN;Oa+6A> zdhH6jw6sK$Gw;=&dm?ju{FQ6w0WNsfvPH#i}{t&rP)_^|2P z#h1r!jy^y9#>c9dcaGwABBlVjM!9GwEFGQtBn(gu-Eu1$dhMJ&eDZ_&sGVGxjjBLx zf*aFddU?C&$&BlI&r}T!@IIyWRnTiZ_<6^p`zfWTg)j#UBWkB=T!y`p|KlB_1}vOp z%t#Ac7>PbBwjQV^I8csd8a!27&-&lapFV1*A}t4U(KOjXDc3H6rt1{I?zF+!6f}ncv>dO1_|gxr9oIcKXYD>~2-&{P6r311OS8!FK>^b|uliRq(S76BQiXrC@Jw#jf0-zM( zw!kk&n5p0$O-GT!y`hGC7Q4dsT<@pf@7?6^lKi9S!R&qgK z7{VZIOUG`DTX4=piKnsfPB&%w$qNVc!7sK|AgC&!h=N~CghW>Zp13NwZ~MM~8`ft3 zw|M}u(zTgZWlbplIOl{Ubg2;P6r7VN$y=es5xu_qw@*95g}WzCsn8H@Sn22!S6+Xr zejb2@Q&^s6oDt1>y8<&b4$)_Wt$z&8GWxe*1F&hBENgHx%PU(cXzu_B}5x&PTicf3O@;Kxy0uV0cA0gkD(uCa_=>F3)Mj zoV*kEg;1cX;U;v~;rZ<_AR}Y*K+vQLB8aA44B>|*P*4lT0VQiUFt=SE7~W3}dfF6h zfOa$wL|h52A-EVOoAyeigxb<~{X=MebkZ==pa6Fk}{1uZn~n3P%`1W=K5E8f(5ukJrxwyPkck zYoYi3^<{i4+c}0|#H`K(I=q)AAEPaycr)Jx4FG3#aOP~%VDudBhg+qO5zEeQxdDBB z{PDE_^8nVDec8c0(EG0fD3Km_r1Vp$rl#}2zXA*Z9|6=@X&ty000000NkvXXu0mjf Df9WdY literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/toggleSoftWrap@2x_dark.png b/platform/icons/src/actions/toggleSoftWrap@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..aa03b86ffbc9ec07f1b566f2ff5c84a6ce5244d2 GIT binary patch literal 1183 zcmV;Q1YrA#P)oD*-AOh(lig@f_?XF=ne*L#-|zdDhhfNWzWz&Cx*0cie$y0CVRRym>(JS&*(1}}PQ`%d z$b>4`BnzIIy0TLTdM*g`%h8@Oc+NR%hJpGrn~;Oq?CwF%c;0cH?OgDfZ%xZE9)ON4 z5VM)x#|7u3K)uKy=dI3;8SstQH;T*HDim7t2mGrot-`leH#wg|sU2}WmyvSEl}stk z4xXug-?eoMUB=g7paA7uh%pI(NY}9;L2XMQzN3*!wPeme`EQfM~7!T_X9h{EvUH zRwgz2$bi7FMr-eHmzMGE5Ohx~ZITTj8+EPz0)!mE*`c()2u}vmN5Qa0Wt026D}hpn zwbm1f-LNrAoD1e69l*!dprXDo#=HcGolX~rc)0TidT8UFrnYC7b#rh#{U*GdmpN|m3{%WYk^T2IRB_DU1c>a}ljJ`DVTef7%y zyhSgFdAWf5Cs1NHjHx~AWCnEISOlB4<8rCY;4yh#K;9pK*Eirj$}>Q%n>t|Elg2fe zyPO^R`xn& xVjhU=Z~u>oDq1ry^j1J*hqYOM9{5*)0RVIm*9=p!u{{6)002ovPDHLkV1m#yMFRi; literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/traceInto.png b/platform/icons/src/actions/traceInto.png index 8903aae5beb85dcb5e5b119be6916676d3d58d79..2b72d2982161f61126be25f7cfd0863748bc46eb 100644 GIT binary patch delta 302 zcmV+}0nz^O0`3BkNq-PYL_t(|+G70w|33pIfRSnjL`6jrV-h2bv258gFwKNT0X8g; z%S0vuHu3}UB_MtX<%3+gg%krm0 z#l)malmUPL{=fbE_g`&BMuY(%FaQ1f?>14<`0K~7#^1mG09}BDf&5=Te>D>w3+4^0 z!dX~Z>lqmtR40H+@BI1wyYXa0*h;G9Mt}eV0B;s_38Vci9{>OV07*qoM6N<$g76%P Ao&W#< delta 304 zcmV-00nh&K0`LNmNq-VaL_t(|+G70w|33pIfQf-Zzyf1LMMV+g6h;_h*|KF=UBHL~ z%aiK`ejvUC#1El-kSn*4V!%fr_5$K3Q2sd}_9ZnCpFj<{2E?{dS6~JrasXigmw{Lt zYp4=R2M(=k!lhgsRe@@6|NZl~=|FYxDxwUqYh4?{!GFoNnw^7SNI{QA$Y@piG{g=g&nAwjfH`cl^INf`9K$83j-`BFsl9oQon!ygA0LK zOiZdo8SwY-|J%QR|J7z>L>K__^54JzZW9%azkd8`{Qc_>&;>{s$p7{8S2IxtoNNeN z{qx(8h(AC7Tq*zi>(6fx4dS1y4_ireG!g;;0R{ju7Ivg^W=W_30000Sbd zsynx(+6QQ{1sfxho$f8tZ6Qj;eOrpI+GQw8C^boBu8Oc4XTrqb z$PaGQhV87axF)!TH`|>9;+7;<{%Txy`a1S<1W!wAeR#Y9#(;rXya%iUAGVA6I|~;{v`ye~@k@UuP}Q#Puos{p%gz-^ah?H-?^4=Nb#j$ z9oxjVW8S&|=^jGGq0k)X`{sU^iuVk9BOtigaNb<$Nq?naPu&{3dF_3g4j5n@sNS%~vK*k(=D<(jRXjJ#UIVB9i-grU6D9^n ze)unCc%QKybAn5FD^a(4^0%RvBN#5NcVe0aMu3;G_yE`dKJFCrC#fC5P-!hEg!n9# ze4(TyAul_)vyP0lWR0!C#?)@{ZN<9-0}E?8rQ~`LW<)m3QV?Vajx^R_n4(Bi{j5$= zT{~lJet+S*6ZdwYzxbsq6R2uSYuEu$kY(eFq`1t0#dobSY@E)1pEGJYGTq-w?~eVD zP||b|1|8Y9kW?5DA##hhubpjxpIOFhti!t4Gvloalu~2(D9^-MM2c?&udz<7JL0Vh zknUbE4n%XD@4Fk0RJ^Chn*)N$hVy2oC;dyop1L;&kl6!kU0;&uoAw;}bHLaQlv-bM z<6ISX(;EpRZ9ZvjYJ3EVfQAJ958fR3KA%6K;vj6}9 literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/traceOver.png b/platform/icons/src/actions/traceOver.png index 4c88b9b151b2054ec73e882e83307a9840e91bd8..e78bddab632bd22d6afabe5949f1997d04948a6c 100644 GIT binary patch delta 352 zcmV-m0iXVy1E2$tNq<5~L_t(|+MH9pPQx$|wjI}Pf?(hsGId~PL9B=oWKdQf1E~~H zUj->t6)%7UV(ZMnkeQtc694vWR1$$hqMr2We7?Icch(ndtwmjSI9u?DMiY#23iX9n z`sVrajB!oi*4Ek-o~P>pMJcYO zP%uFQ5Q|FO_99qL`Mmlp&sC+~v{2G{7cZ}P9$KM|#1-eET!>)c-mI?N9Xz?!0q>jY;0W;1R|mMy@BE*w1Q-BRU(vWZK%8y>0000*p|Q#yppj3Vd& z5law-e-f!D@VN!R3bg_^aBg5DrTISeJ3?|7=&uVume#hCQjali0d8!qP31X%J)o$? zr4$M}=m>Jri0df8a?0n;dwr@J^`eE6F1mbq!OPGHeGpe%hQ5UW1NUaJJ_wC)2gh diff --git a/platform/icons/src/actions/traceOver@2x.png b/platform/icons/src/actions/traceOver@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..32145369654789f069f700542686e1b7a49711ae GIT binary patch literal 828 zcmV-C1H=4@P)S9<1W|!>i69ITwA%g7 zk3R3)W+AJ7)vtbs{V=mLZ|1#yZ|1$v3g;YU*}Sw4I$3_&hVCYC4mez&{s6oH9=;kZ zE;QOF((u5Ea-}GQ7?n!4C@D!u5zjm8$XH9(*zeGD?e$>kS?UIK4p&M_$#FmQL=Xn# z`yRoNcnyjviZs=#HHxa*8Dp=`43{QSGvN5(_E;{l7atuYkU zH2wThrRuNhqK?eL*>d+n!#mK^)00^F*w`46q+5RI7lP)HyuinIL6%&sc%{J`D)cE7 zY>;i$#`IzK-rr@p9rr7x&iZgW`dBGk+z{+#mVvR{pI`44B#lSxW9g}OflFs_*~li? zDkO*KNNUeeC|QGAk8gUC=0vscP5z~^0R9&pA^;i+{bmXBYB zeg6O4wk~0$%_FVN5{DoWj9t`PkECY6+)(kej&v`6mE)wd0UTtn&kdCpQZsR< zd+95>fjSa5Ng21y`9LZjU_OAPJq8W;ED9b@pKmkf~ z42*e>*Dw~4eT+SAn+?GkU=}#kz<>Yv07@;_e&z!jMS{WO6+Vy;*%PhU)3=p7(9Veu zIGr{hSjzy{fE#cars`p#)qFr}yDnnRkOCi2KyD}bfLMniML;j`Bnv*U3>51j*mXYe z4LG%0`EK!nPn>J&FCY^>&{@ytnel-yJIx0~)_>1`3orn%U~_*?4XoGz0000hSbAR}J&n%D@ zZ7V4-+J@AsT1k=Fdl|06MNm*}OM8kD?SvLCTDS^9UnEhHe?a-rU5g+pkTz|?AVI75 z?)>PR>qW|ZdChsg!~K|H=FH5Qb7szbmla_U=)}n5HWW92Gr*yw`2+9*7=2aD zFK#rBx$wa8ky4&9HqHfa5u6j_EN(a2kkXp8(%-Po<=4f+Q|AVB4wni-@JT=PSP%x} z`yRoNxDN|c6iKR9suWeEQA%Gb4;QAK8E~vPxzF>(`=(5o1IQ2T;(|C^^?=6QS}BUE zl74)zP~~T3Nk;0x+(_?QIQX`<&*`Qg`njMvBro)duyaj@q|q^K-L?tzg;^LF`mGpq z?awK;Awq~QA8tn(?-nlJ5Z2392L{;kY|UFRF)@)U9({d%v5&bY+8GX=!eJwwVkqM_ zM2DSSLne3?%X;>trxC;AF{$zZOEsaU1+7g-s@+?CgaY3?XC5$0&)}+cq}Gpbg?{Gj z5JplxkWww%5Tt_AOH#@)X9mm<7T?^dfgLn~-22FS&0Mw75?H2kzLg(E77%;Y(mn?mP|H7 z*Zs<%y_u^I!xC*=k_SE77T(I#l6R>71l)c$vTr#8^V^Zao}Ti{yuh=Z^1do z$nrdAKFhLUExZU>uSf4_ep1$>zj)(j{08bj(^;YHh~=8v=SaYwI#- z1+`RDtqk6v1&mdt?t=&xlk}`#sB~S07*qoM6N<$f`;v*^Z)<= literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/uninstall.png b/platform/icons/src/actions/uninstall.png index 5f9427ea60b7330f1f6ff5d024cc05b342e8facd..4555fe0ea9578b5708eaa47693fd568af0d4b8c0 100644 GIT binary patch delta 334 zcmV-U0kQsq1FHj&NdZlfN+Ew3u^DhG!jqYmgJT^F8=K#sU%xi}{_!KoY{mA!L>X`@ z%!84YlVdTL0Dm-)X88U62gA1yAD05@ShH0-Fl=MN5MXDU%E`wY&B4RXz|6|Rz|73d z@c-YxXdwOsl+MEIf-_M*?OgnP6`cIM3_#~IFfuYSfaHPRVEF#=GsAzkkDoeBmTjpd z7zQBlpd$S+6Em~TzrTNvD0IxU#TAGwxFmjk{l>t`!Orme$4>@)0PKS5>S_#$=vTK7 zb8vIn{P_Cq$Wk#?3>UPvwt{IUTqXkpjp6^_e_$FPfEn-~39koYz5jpzGC(mah!4c; z(9{v(f`7oY^Y0%QJ{Llu2O=Y!_3u9fL+rW)#6d`|B^(PYcdy=HTIGU}j}uU}k1!`2X);G!TCRN@wA9!I>zZb`Bn% zOm=QA1}30J24L`jXb>MH4w6SVfDu<9KB!1P4AgA%@9*Cu3LP_TafN>Y3oeOYU%xQ` z1CZhOkDmS_#$XrM+Gp!5F#X>9VXt*yAD5d?sN#_<2|KQN6Czzq10gx3SH z-v7UU8K9UI#0TPaXzGY?!N0!@4FCRd5ex(5Sb?+t{fA(PU6+732+6gCV_}87t}O!* r0NsH93?u?31_}Yrlt>vY00=Muy0>jCA`Hqt00000NkvXXu0mjfGz5bs diff --git a/platform/icons/src/actions/unselectall.png b/platform/icons/src/actions/unselectall.png index 81a1f0b59659621ddb4bb7237df383dc8e87b231..59b4ae1f6d591dbc4ec149e5481624b979a5aade 100644 GIT binary patch delta 143 zcmV;A0C4}{0nh=ENq=%lL_t(|+G70w|33pIfDvTCj2Sb|5Ub(WuU{rGc3xf{0}GN| z1u+IZeE1NB&w^(9ZbAmg%gdwqfQ66^gbZTACfQI|)re1XLsMHljLpPAAs97)S_XiU x=k43K_mE=%3!!)>*#NYpN?dNF1ONmW01^==7BV-kxc~qF00>D%PDHLkV1jlzIpqKV delta 159 zcmV;Q0AT;n0pJ0UNq>S#L_t(|+G70w|33pIfCWU%m@(rF33^O2GBQvNfP!tr=>GNV z7sI4Ulfdk}ygU>GK$5jYn1QT@kp*4$<;#~u`9oY>9K#E6P>`3^h)?r`Nz>|KY$gT@ z!KeXLFaQ>fCZH6CmPkl40B1ZC0*tWS2u}1{rUgj{;&g+S{oyqj=`}WN#k=DPVi0c>FH4v zVDeayu|U=#^uz1x`fZ+*)e<|NKYjYJoFU+`qtx!+!VAk7MLv9Z=)5XQLto$iM=@jA zg@Ev@9-XedzPVqUH_1qp9$3NbCTsAjA&|YtieaajNu%jPw-644Mc;cSNKN>kc~gnW r%&XmFw!mIq^FNmlbZE0PF!3<(iE3PV|Nn~s(2We9u6{1-oD!M}1{rUgj{;&g+S{oyqj=`}WN#k=DPVi0c>FH4v zVDeayu|U=#^uz1x`fZ+*)e<|NKYjYJoFU+`qtx!+!VAk7MHZ}H?H$UkAHUD$M=@jA zgU62_yLY-qZ_Bx9qH(%0kiEw$;R@qoK8ex;E0`x_I}1k$XSuX8C|8~5SjqTv{xn^s sgvBKtTR1P?E;ww@+q0vHLE!*H^J=XRhb3B)fNo^)boFyt=akR{0L`sjsQ>@~ literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/unselectall_dark.png b/platform/icons/src/actions/unselectall_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..439efe873cdbac76bb7b16ea2bc2952cfe839884 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XN<3X0Ln>}1{rUgjo>{el)#c0#!{&_Oy1&1UawI>0`qYu9 zp~)bL=fc&iM@twdySV#7bi|^oxt0|lXOr`Qb6EAyZ`4lUTL#~H+*+k⪚ohKbLh* G2~7YHkW7jI literal 0 HcmV?d00001 diff --git a/platform/icons/src/actions/unshare.png b/platform/icons/src/actions/unshare.png index 233b404e744ac7a2381dffb4b5f50ae318e8c3cc..d7d977a54e1681d581fa103a84488269b62cf122 100644 GIT binary patch delta 671 zcmV;Q0$~051*`>-8Gi-<0019IEztk~02y>eSaefwW^{L9a%BKPWN%_+AW3auXJt}l zVPtu6$z?nM00K@)L_t(|+G70w|33pcfRS8{EY;Q3=wg0MOicMe+LDox@i)-m)Bpbc zn+)V{MA3-E76fWo!o$O3=;r3e%q$}Njh%(*|JUaabaw9CIe+!rw{HnR1CoI1-h&h~ z+uGWKXi;Wn=A#A%1~T!9Ns`YPc(~_Zd&_m|)pxG*pIEt)d|kdU{P@EB`t@r!pbK^Z z)qi6G5?nw{JFKj%I0J)%ST4T&%4jCd$N2lmI)*)cwG1!s-}u{i;we*5aPUVW20P)Kar zEmhM4On?9WO}cgK){E`ixBpQQ=K9S93;|(tKL$a5{(l|mf8TT3|NayuSl;qeYTK#b zTmg}+f^VL8Cm-3M4)WtSpk|Nb$B%zszi!>{T6=}J?BdE_m|b$OoB#Oe&s*8?PT0v! z<>#fdT;I2^lLKmg%<}JVHO#56ftoEYT)430&Ye5DC2npnSVZOSa?brBDQIr>`^U+{ z4DVaZ8Gi)Jni<&5?IgdhUW5{l?}4uL{`BdS&$@N%B7l7EWG1F3@8?fp`L%PS4A8j@ z9M(<@KaTFZ29#rE!IGM`WE@_%g^`t&;s4)1-+yjczMR`X;x4MMJZQI= zJVbV-q$*tT3Mn<9V5qqtko>^P4p9JSAPYjIKC`g>Wn}!$%mO5VBF$a1fn-zHtUd+( zVlCULeleMvcD)MvnN154JmNpGu>E9Wb_y-b(6CF$Z&|qWLTzDlReocKqG46VaqZtcv}#(7R*g+_K!5UW#-+>M>$elalt zxwZLCU5Z9PMonJB|Ns9X4o+y>XcE~HHtl-)vMcKjpYxykA!z>BxFz@QD;hKgHlBO= zr+UvH-hVr`qQ zcC9?HSJUFq!`3)p426~i`2{m{F|>;KVbg|_ z^HP%ymcIG?{`0GEufEQHcl_&*D<8j|JO2Fdj~}m}KmWD#`MFJK0P2OCA+T7BP_YauZ zEuVTL`bGqYrw3D~fQ(bjhC*)RuF0=0JMOeUf9-K4-Y1{+;>4HVdM~_O=%n*iLU-=g zii6Fw+*Ha`qpi>0RR2)Z{_5O#JAN5H08|IR|?|dFC8}2oAgHm{lnnt>gTe~DWM4fP61nf diff --git a/platform/icons/src/actions/unshare@2x.png b/platform/icons/src/actions/unshare@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c6ad52c64907aa0f0806f0c21a8ac49673a6669a GIT binary patch literal 1583 zcmV+~2GIG5P)RCwClmTOEDR}{z3>^$}XySz~Z zLU}eKNP%i&3`Iq(X;DjgSYvA|ZPPFP)F#!$q}HaXX_F?@q#v5tn1(bBsn!G<3pEm~ zl~lkdRz%qaVFea;S@t^dU!)V~F%n!H2x3kT;Qi^F-#iLX9^x@sE*1i26?i zvyc{~g8WHHNZ?CLOXd9hd@(UGF-%bu%+AizR;!ik@9$^aZZ~o0TV#jk_@Lvu`HEXGPKmPqW>C_fcLa=WSEgeG zNr4SzPy5Qt%l(s+lM>FBM*Avc3K@Km;CAGDGIQ+r)z;SPSe7NmV9_(W8BwO3ynM%4 zM*+vtly#2hF4(GX%f@cyxD=76G7>9H)N#Ok5{j~=kyxB;NZ5S(?u{+rjJYea;u(>-9|BFjp`MZD*QDQh2& z8NjjQXfsLrNU^|g>Few3W1LQBvcusZ6M2~kMywfz0gU_Kw=hMi;jj{UHqaEP?CtlG zCN_o~e~MFWTYvjzZL)8AJ12)0Uj$Xvae6zOka#k6%hnc}rpL8Nn#dZSz=v%RgWH5%2JdVP3z9PcS+6geK>plukY+Yf{9%B7f;Q1C#F!}^XX zES-<;Qj(yTk;ajc5d+6@YF1X3gsG?UAsGgz1A5?0GM!c+GQ3w{1b=TPP4&IRNV{>x z*|dh&A^o+tflE#Wie@6HvJ5kwZJ-GJt?I8TYw+jb{5%}e3h?IP;b8-AX~@aR2`x`E zhX$wow8Iw)tDI3#mlX19-m0!T&$aS+!L!^_x&ks#Y;w3TH(e@(bssSY=A!q~Ir8WsWt90B7qA&^M<0olJ`^IeRFaal z#J`St*bd%{XF;?BB-U3FSIneSub(HuMaU)@WOXou{l$OY{v3Tc&V hKav*}BkeB%1^|WymYqlqs%roM002ovPDHLkV1kk{64n3! literal 0 HcmV?d00001 From 37430f2d70effaf93c5d30c2b5d09acc176f9f5c Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 8 Mar 2013 14:16:46 +0400 Subject: [PATCH 45/57] jps model: added api for loading model --- .../jetbrains/jps/cmdline/JpsModelLoader.java | 4 +- .../jps/cmdline/JpsModelLoaderImpl.java | 42 +++++------------- ...odel.serialization.JpsSerializationManager | 1 + .../JpsSerializationManager.java | 37 ++++++++++++++++ .../impl/JpsSerializationManagerImpl.java | 44 +++++++++++++++++++ 5 files changed, 97 insertions(+), 31 deletions(-) create mode 100644 jps/model-serialization/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsSerializationManager create mode 100644 jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSerializationManager.java create mode 100644 jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsSerializationManagerImpl.java diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/JpsModelLoader.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/JpsModelLoader.java index a5499a4c8aae..66b8c31cf94c 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/JpsModelLoader.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/JpsModelLoader.java @@ -17,9 +17,11 @@ package org.jetbrains.jps.cmdline; import org.jetbrains.jps.model.JpsModel; +import java.io.IOException; + /** * @author nik */ public interface JpsModelLoader { - JpsModel loadModel(); + JpsModel loadModel() throws IOException; } diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/JpsModelLoaderImpl.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/JpsModelLoaderImpl.java index 0e84370d422c..0a99678323ea 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/JpsModelLoaderImpl.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/JpsModelLoaderImpl.java @@ -17,12 +17,10 @@ package org.jetbrains.jps.cmdline; import com.intellij.openapi.diagnostic.Logger; import com.intellij.util.ParameterizedRunnable; -import org.jetbrains.jps.model.JpsElementFactory; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsModel; -import org.jetbrains.jps.model.serialization.JpsGlobalLoader; -import org.jetbrains.jps.model.serialization.JpsProjectLoader; +import org.jetbrains.jps.model.serialization.JpsSerializationManager; -import java.io.File; import java.io.IOException; import java.util.Map; @@ -37,7 +35,7 @@ public class JpsModelLoaderImpl implements JpsModelLoader { private final ParameterizedRunnable myModelInitializer; public JpsModelLoaderImpl(String projectPath, String globalOptionsPath, Map pathVars, - ParameterizedRunnable initializer) { + @Nullable ParameterizedRunnable initializer) { myProjectPath = projectPath; myGlobalOptionsPath = globalOptionsPath; myPathVars = pathVars; @@ -45,32 +43,16 @@ public class JpsModelLoaderImpl implements JpsModelLoader { } @Override - public JpsModel loadModel() { + public JpsModel loadModel() throws IOException { final long start = System.currentTimeMillis(); - try { - final JpsModel model = JpsElementFactory.getInstance().createModel(); - try { - if (myGlobalOptionsPath != null) { - JpsGlobalLoader.loadGlobalSettings(model.getGlobal(), myPathVars, myGlobalOptionsPath); - } - JpsProjectLoader.loadProject(model.getProject(), myPathVars, myProjectPath); - if (myModelInitializer != null) { - myModelInitializer.run(model); - } - LOG.info("New JPS model: " + model.getProject().getModules().size() + " modules, " + model.getProject().getLibraryCollection().getLibraries().size() + " libraries"); - } - catch (IOException e) { - LOG.info(e); - } - return model; + LOG.info("Loading model: project path = " + myProjectPath + ", global options path = " + myGlobalOptionsPath); + final JpsModel model = JpsSerializationManager.getInstance().loadModel(myProjectPath, myGlobalOptionsPath, myPathVars); + if (myModelInitializer != null) { + myModelInitializer.run(model); } - finally { - final long loadTime = System.currentTimeMillis() - start; - LOG.info("New JPS model: project " + myProjectPath + " loaded in " + loadTime + " ms"); - } - } - - private static boolean isDirectoryBased(File projectFile) { - return !(projectFile.isFile() && projectFile.getName().endsWith(".ipr")); + final long loadTime = System.currentTimeMillis() - start; + LOG.info("Model loaded in " + loadTime + " ms"); + LOG.info("Project has " + model.getProject().getModules().size() + " modules, " + model.getProject().getLibraryCollection().getLibraries().size() + " libraries"); + return model; } } diff --git a/jps/model-serialization/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsSerializationManager b/jps/model-serialization/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsSerializationManager new file mode 100644 index 000000000000..5fa4b3ae61cd --- /dev/null +++ b/jps/model-serialization/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsSerializationManager @@ -0,0 +1 @@ +org.jetbrains.jps.model.serialization.impl.JpsSerializationManagerImpl \ No newline at end of file diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSerializationManager.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSerializationManager.java new file mode 100644 index 000000000000..3688fff08537 --- /dev/null +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSerializationManager.java @@ -0,0 +1,37 @@ +/* + * Copyright 2000-2013 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.serialization; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.JpsModel; +import org.jetbrains.jps.service.JpsServiceManager; + +import java.io.IOException; +import java.util.Map; + +/** + * @author nik + */ +public abstract class JpsSerializationManager { + public static JpsSerializationManager getInstance() { + return JpsServiceManager.getInstance().getService(JpsSerializationManager.class); + } + + @NotNull + public abstract JpsModel loadModel(@NotNull String projectPath, @Nullable String optionsPath, @NotNull Map pathVariables) + throws IOException; +} diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsSerializationManagerImpl.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsSerializationManagerImpl.java new file mode 100644 index 000000000000..ee02ae647b29 --- /dev/null +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsSerializationManagerImpl.java @@ -0,0 +1,44 @@ +/* + * Copyright 2000-2013 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.serialization.impl; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.JpsElementFactory; +import org.jetbrains.jps.model.JpsModel; +import org.jetbrains.jps.model.serialization.JpsGlobalLoader; +import org.jetbrains.jps.model.serialization.JpsProjectLoader; +import org.jetbrains.jps.model.serialization.JpsSerializationManager; + +import java.io.IOException; +import java.util.Map; + +/** + * @author nik + */ +public class JpsSerializationManagerImpl extends JpsSerializationManager { + @NotNull + @Override + public JpsModel loadModel(@NotNull String projectPath, @Nullable String optionsPath, @NotNull Map pathVariables) + throws IOException { + JpsModel model = JpsElementFactory.getInstance().createModel(); + if (optionsPath != null) { + JpsGlobalLoader.loadGlobalSettings(model.getGlobal(), pathVariables, optionsPath); + } + JpsProjectLoader.loadProject(model.getProject(), pathVariables, projectPath); + return model; + } +} From 7d68d0532d146fee35dc1386d94642329aaa564b Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 8 Mar 2013 14:25:16 +0400 Subject: [PATCH 46/57] cleanup --- .../src/org/jetbrains/jps/cmdline/BuildRunner.java | 2 +- .../src/org/jetbrains/jps/cmdline/BuildSession.java | 11 ++++++----- .../jps/model/artifact/impl/JpsArtifactRole.java | 4 ++-- .../jps/model/module/impl/JpsModuleRole.java | 4 ++-- .../model/module/impl/JpsModuleSourceRootRole.java | 4 ++-- .../jps/ant/model/impl/JpsAntInstallationImpl.java | 2 +- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildRunner.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildRunner.java index 1c6edbf86772..14a12542d300 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildRunner.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildRunner.java @@ -104,7 +104,7 @@ public class BuildRunner { targetsState = new BuildTargetsState(dataPaths, jpsModel, buildRootIndex); projectTimestamps = new ProjectTimestamps(dataStorageRoot, targetsState); dataManager = new BuildDataManager(dataPaths, targetsState, STORE_TEMP_CACHES_IN_MEMORY); - // second attempt succeded + // second attempt succeeded msgHandler.processMessage(new CompilerMessage("build", BuildMessage.Kind.INFO, "Project rebuild forced: " + e.getMessage())); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java index e8e20e1b5d61..61fa904eb21e 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java @@ -61,11 +61,11 @@ final class BuildSession implements Runnable, CanceledStatus { private final UUID mySessionId; private final Channel myChannel; private volatile boolean myCanceled = false; - private String myProjectPath; + private final String myProjectPath; @Nullable private CmdlineRemoteProto.Message.ControllerMessage.FSEvent myInitialFSDelta; // state - private EventsProcessor myEventsProcessor = new EventsProcessor(); + private final EventsProcessor myEventsProcessor = new EventsProcessor(); private volatile long myLastEventOrdinal; private volatile ProjectDescriptor myProjectDescriptor; private final Map, ConstantSearchFuture> mySearchTasks = Collections.synchronizedMap(new HashMap, ConstantSearchFuture>()); @@ -304,7 +304,8 @@ final class BuildSession implements Runnable, CanceledStatus { } } - private void applyFSEvent(ProjectDescriptor pd, @Nullable CmdlineRemoteProto.Message.ControllerMessage.FSEvent event, final boolean saveEventStamp) throws IOException { + private static void applyFSEvent(ProjectDescriptor pd, @Nullable CmdlineRemoteProto.Message.ControllerMessage.FSEvent event, + final boolean saveEventStamp) throws IOException { if (event == null) { return; } @@ -369,7 +370,7 @@ final class BuildSession implements Runnable, CanceledStatus { } } - private void updateFsStateOnDisk(File dataStorageRoot, DataInputStream original, final long ordinal) { + private static void updateFsStateOnDisk(File dataStorageRoot, DataInputStream original, final long ordinal) { final File file = new File(dataStorageRoot, FS_STATE_FILE); try { final BufferExposingByteArrayOutputStream bytes = new BufferExposingByteArrayOutputStream(); @@ -462,8 +463,8 @@ final class BuildSession implements Runnable, CanceledStatus { } try { final File file = new File(dataStorageRoot, FS_STATE_FILE); - final InputStream fs = new FileInputStream(file); byte[] bytes; + final InputStream fs = new FileInputStream(file); try { bytes = FileUtil.loadBytes(fs, (int)file.length()); } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/artifact/impl/JpsArtifactRole.java b/jps/model-impl/src/org/jetbrains/jps/model/artifact/impl/JpsArtifactRole.java index d497455e0fd9..53586eb77737 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/artifact/impl/JpsArtifactRole.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/artifact/impl/JpsArtifactRole.java @@ -23,10 +23,10 @@ import org.jetbrains.jps.model.ex.JpsElementChildRoleBase; * @author nik */ public class JpsArtifactRole extends JpsElementChildRoleBase { - public static final JpsArtifactRole INSTANCE = new JpsArtifactRole(); + private static final JpsArtifactRole INSTANCE = new JpsArtifactRole(); public static final JpsElementCollectionRole ARTIFACT_COLLECTION_ROLE = JpsElementCollectionRole.create(INSTANCE); - public JpsArtifactRole() { + private JpsArtifactRole() { super("artifact"); } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleRole.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleRole.java index a55659ee85c4..54e9e6ae023d 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleRole.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleRole.java @@ -27,10 +27,10 @@ import org.jetbrains.jps.model.module.JpsModuleListener; * @author nik */ public class JpsModuleRole extends JpsElementChildRoleBase { - public static final JpsElementChildRole INSTANCE = new JpsModuleRole(); + private static final JpsElementChildRole INSTANCE = new JpsModuleRole(); public static final JpsElementCollectionRole MODULE_COLLECTION_ROLE = JpsElementCollectionRole.create(INSTANCE); - public JpsModuleRole() { + private JpsModuleRole() { super("module"); } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleSourceRootRole.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleSourceRootRole.java index d3f087a0722f..be9d2fc20c14 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleSourceRootRole.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleSourceRootRole.java @@ -26,10 +26,10 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootListener; * @author nik */ public class JpsModuleSourceRootRole extends JpsElementChildRoleBase { - public static final JpsModuleSourceRootRole INSTANCE = new JpsModuleSourceRootRole(); + private static final JpsModuleSourceRootRole INSTANCE = new JpsModuleSourceRootRole(); public static final JpsElementCollectionRole ROOT_COLLECTION_ROLE = JpsElementCollectionRole.create(INSTANCE); - public JpsModuleSourceRootRole() { + private JpsModuleSourceRootRole() { super("module source root"); } diff --git a/plugins/ant/jps-plugin/src/org/jetbrains/jps/ant/model/impl/JpsAntInstallationImpl.java b/plugins/ant/jps-plugin/src/org/jetbrains/jps/ant/model/impl/JpsAntInstallationImpl.java index 1db18840e793..ca5dc045265f 100644 --- a/plugins/ant/jps-plugin/src/org/jetbrains/jps/ant/model/impl/JpsAntInstallationImpl.java +++ b/plugins/ant/jps-plugin/src/org/jetbrains/jps/ant/model/impl/JpsAntInstallationImpl.java @@ -34,7 +34,7 @@ public class JpsAntInstallationImpl extends JpsElementBase myClasspath; private final List myJarDirectories; - public static final JpsElementChildRoleBase ROLE = JpsElementChildRoleBase.create("ant installation"); + private static final JpsElementChildRoleBase ROLE = JpsElementChildRoleBase.create("ant installation"); public static final JpsElementCollectionRole COLLECTION_ROLE = JpsElementCollectionRole.create(ROLE); public JpsAntInstallationImpl(File antHome, String name, final List classpath, List jarDirectories) { From 02ee0fece52e02d837699aa945fdd932dbcbcdec Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 8 Mar 2013 14:28:04 +0400 Subject: [PATCH 47/57] facets removed from JPS model --- .../jetbrains/jps/model/module/JpsFacet.java | 45 ---------- .../jps/model/module/JpsFacetListener.java | 26 ------ .../jps/model/module/JpsFacetReference.java | 24 ----- .../jps/model/module/JpsFacetType.java | 26 ------ .../jetbrains/jps/model/module/JpsModule.java | 7 -- .../jps/model/module/impl/JpsFacetImpl.java | 88 ------------------- .../module/impl/JpsFacetReferenceImpl.java | 41 --------- .../jps/model/module/impl/JpsFacetRole.java | 45 ---------- .../jps/model/module/impl/JpsModuleImpl.java | 13 --- .../org/jetbrains/jps/model/JpsFacetTest.java | 40 --------- 10 files changed, 355 deletions(-) delete mode 100644 jps/model-api/src/org/jetbrains/jps/model/module/JpsFacet.java delete mode 100644 jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetListener.java delete mode 100644 jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetReference.java delete mode 100644 jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetType.java delete mode 100644 jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetImpl.java delete mode 100644 jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetReferenceImpl.java delete mode 100644 jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetRole.java delete mode 100644 jps/model-impl/testSrc/org/jetbrains/jps/model/JpsFacetTest.java diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacet.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacet.java deleted file mode 100644 index e4fac75ac921..000000000000 --- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacet.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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.module; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.jps.model.JpsNamedElement; -import org.jetbrains.jps.model.JpsReferenceableElement; - -/** - * @author nik - */ -//todo[nik] I'm not sure that we really need separate interface for facets in the project model. -//Perhaps facets should be replaced by extensions for module elements -public interface JpsFacet extends JpsNamedElement, JpsReferenceableElement { - - JpsModule getModule(); - - @NotNull - JpsFacetType getType(); - - void delete(); - - @NotNull - @Override - JpsFacetReference createReference(); - - void setParentFacet(@NotNull JpsFacet facet); - - @Nullable - JpsFacet getParentFacet(); -} diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetListener.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetListener.java deleted file mode 100644 index 582e35bfc8aa..000000000000 --- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetListener.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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.module; - -import java.util.EventListener; - -/** - * @author nik - */ -public interface JpsFacetListener extends EventListener { - void facetAdded(JpsFacet facet); - void facetRemoved(JpsFacet facet); -} diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetReference.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetReference.java deleted file mode 100644 index f4754b45242c..000000000000 --- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetReference.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * 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.module; - -import org.jetbrains.jps.model.JpsElementReference; - -/** - * @author nik - */ -public interface JpsFacetReference extends JpsElementReference { -} diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetType.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetType.java deleted file mode 100644 index 4ae5adc90d5d..000000000000 --- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetType.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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.module; - -import org.jetbrains.jps.model.JpsElement; - -/** - * @author nik - */ -//todo[nik] I'm not sure that we really need separate interface for facets in the project model. -//Perhaps facets should be replaced by extensions for module elements -public abstract class JpsFacetType

{ -} diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsModule.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsModule.java index 668b4f18c372..e11ca1c0fc18 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsModule.java +++ b/jps/model-api/src/org/jetbrains/jps/model/module/JpsModule.java @@ -54,13 +54,6 @@ public interface JpsModule extends JpsNamedElement, JpsReferenceableElement - JpsFacet addFacet(@NotNull String name, @NotNull JpsFacetType

type, @NotNull P properties); - - @NotNull - List getFacets(); - JpsDependenciesList getDependenciesList(); @NotNull diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetImpl.java deleted file mode 100644 index 9822b5b40dcd..000000000000 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetImpl.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * 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.module.impl; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.jps.model.JpsElement; -import org.jetbrains.jps.model.JpsElementChildRole; -import org.jetbrains.jps.model.JpsElementCollection; -import org.jetbrains.jps.model.ex.JpsElementChildRoleBase; -import org.jetbrains.jps.model.ex.JpsNamedCompositeElementBase; -import org.jetbrains.jps.model.module.JpsFacet; -import org.jetbrains.jps.model.module.JpsFacetReference; -import org.jetbrains.jps.model.module.JpsFacetType; -import org.jetbrains.jps.model.module.JpsModule; - -/** - * @author nik - */ -public class JpsFacetImpl extends JpsNamedCompositeElementBase implements JpsFacet { - private static final JpsElementChildRole PARENT_FACET_REFERENCE = JpsElementChildRoleBase.create("parent facet"); - private final JpsFacetType myFacetType; - - public

JpsFacetImpl(JpsFacetType facetType, @NotNull String name, @NotNull P properties) { - super(name); - myFacetType = facetType; - myContainer.setChild(JpsFacetRole.COLLECTION_ROLE); - } - - private JpsFacetImpl(JpsFacetImpl original) { - super(original); - myFacetType = original.myFacetType; - } - - @NotNull - @Override - public JpsFacetImpl createCopy() { - return new JpsFacetImpl(this); - } - - @Override - @NotNull - public JpsFacetType getType() { - return myFacetType; - } - - @Override - public void setParentFacet(@NotNull JpsFacet facet) { - myContainer.setChild(PARENT_FACET_REFERENCE, facet.createReference()); - } - - @Override - @Nullable - public JpsFacet getParentFacet() { - final JpsFacetReference reference = myContainer.getChild(PARENT_FACET_REFERENCE); - return reference != null ? reference.resolve() : null; - } - - @Override - public JpsModule getModule() { - return myParent != null ? (JpsModule)myParent.getParent() : null; - } - - @NotNull - @Override - public JpsFacetReference createReference() { - return new JpsFacetReferenceImpl(getName(), getModule().createReference()); - } - - @Override - public void delete() { - //noinspection unchecked - ((JpsElementCollection)myParent).removeChild(this); - } -} diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetReferenceImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetReferenceImpl.java deleted file mode 100644 index a1d9b3593ea0..000000000000 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetReferenceImpl.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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.module.impl; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.jps.model.impl.JpsNamedElementReferenceImpl; -import org.jetbrains.jps.model.module.JpsFacet; -import org.jetbrains.jps.model.module.JpsFacetReference; -import org.jetbrains.jps.model.module.JpsModuleReference; - -/** - * @author nik - */ -public class JpsFacetReferenceImpl extends JpsNamedElementReferenceImpl implements JpsFacetReference { - public JpsFacetReferenceImpl(String facetName, JpsModuleReference moduleReference) { - super(JpsFacetRole.COLLECTION_ROLE, facetName, moduleReference); - } - - private JpsFacetReferenceImpl(JpsFacetReferenceImpl original) { - super(original); - } - - @NotNull - @Override - public JpsFacetReferenceImpl createCopy() { - return new JpsFacetReferenceImpl(this); - } -} diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetRole.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetRole.java deleted file mode 100644 index d59044b60f16..000000000000 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetRole.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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.module.impl; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.jps.model.JpsEventDispatcher; -import org.jetbrains.jps.model.ex.JpsElementCollectionRole; -import org.jetbrains.jps.model.ex.JpsElementChildRoleBase; -import org.jetbrains.jps.model.module.JpsFacet; -import org.jetbrains.jps.model.module.JpsFacetListener; - -/** - * @author nik - */ -public class JpsFacetRole extends JpsElementChildRoleBase { - public static final JpsFacetRole INSTANCE = new JpsFacetRole(); - public static final JpsElementCollectionRole COLLECTION_ROLE = JpsElementCollectionRole.create(INSTANCE); - - public JpsFacetRole() { - super("facet"); - } - - @Override - public void fireElementAdded(@NotNull JpsEventDispatcher dispatcher, @NotNull JpsFacet element) { - dispatcher.getPublisher(JpsFacetListener.class).facetAdded(element); - } - - @Override - public void fireElementRemoved(@NotNull JpsEventDispatcher dispatcher, @NotNull JpsFacet element) { - dispatcher.getPublisher(JpsFacetListener.class).facetRemoved(element); - } -} diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java index 847affcb3219..8bf2845b136a 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java @@ -50,7 +50,6 @@ public class JpsModuleImpl

extends JpsNamedCompositeElemen myContainer.setChild(myModuleType.getPropertiesRole(), properties); myContainer.setChild(CONTENT_ROOTS_ROLE); myContainer.setChild(EXCLUDED_ROOTS_ROLE); - myContainer.setChild(JpsFacetRole.COLLECTION_ROLE); myContainer.setChild(DEPENDENCIES_LIST_CHILD_ROLE, new JpsDependenciesListImpl()); getDependenciesList().addModuleSourceDependency(); myLibraryCollection = new JpsLibraryCollectionImpl(myContainer.setChild(JpsLibraryRole.LIBRARIES_COLLECTION_ROLE)); @@ -136,18 +135,6 @@ public class JpsModuleImpl

extends JpsNamedCompositeElemen } } - @NotNull - @Override - public

JpsFacet addFacet(@NotNull String name, @NotNull JpsFacetType

type, @NotNull P properties) { - return myContainer.getChild(JpsFacetRole.COLLECTION_ROLE).addChild(new JpsFacetImpl(type, name, properties)); - } - - @NotNull - @Override - public List getFacets() { - return myContainer.getChild(JpsFacetRole.COLLECTION_ROLE).getElements(); - } - @NotNull @Override public JpsDependenciesList getDependenciesList() { diff --git a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsFacetTest.java b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsFacetTest.java deleted file mode 100644 index 7c1f7ae95ea7..000000000000 --- a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsFacetTest.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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; - -import org.jetbrains.jps.model.java.JpsJavaModuleType; -import org.jetbrains.jps.model.module.JpsFacet; -import org.jetbrains.jps.model.module.JpsFacetType; -import org.jetbrains.jps.model.module.JpsModule; - -/** - * @author nik - */ -public class JpsFacetTest extends JpsModelTestCase { - public void testAddFacet() { - final JpsModule m = myProject.addModule("m", JpsJavaModuleType.INSTANCE); - m.addFacet("f", MY_FACET_TYPE, JpsElementFactory.getInstance().createDummyElement()); - assertEquals("f", assertOneElement(m.getFacets()).getName()); - } - - public void testCreateReferenceByFacet() { - final JpsFacet facet = myProject.addModule("m", JpsJavaModuleType.INSTANCE).addFacet("f", MY_FACET_TYPE, JpsElementFactory.getInstance().createDummyElement()); - final JpsElementReference reference = facet.createReference().asExternal(myModel); - assertSame(facet, reference.resolve()); - } - - private static final JpsFacetType MY_FACET_TYPE = new JpsFacetType() { }; -} From 19803e7436cb4bb488a0451a88e65e6dac10019b Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Fri, 8 Mar 2013 11:31:32 +0100 Subject: [PATCH 48/57] IDEA-97353 (Method can be variable arity method shall have an option to be ignored on methods implementing/overriding another method) --- .../siyeh/InspectionGadgetsBundle.properties | 3 +- ...hodCanBeVariableArityMethodInspection.java | 55 +++++++++---------- .../MethodCanBeVariableArityMethod.html | 4 ++ .../MethodCanBeVariableArity.java | 7 +++ ...anBeVariableArityMethodInspectionTest.java | 7 +-- 5 files changed, 42 insertions(+), 34 deletions(-) diff --git a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties index e4987fe503f0..3be454caa5c3 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties @@ -1226,7 +1226,7 @@ object.notify.replace.quickfix=Replace with 'notifyAll()' safe.lock.problem.descriptor=''{0}'' should be locked in front of a ''try'' block and unlocked in the corresponding ''finally'' block #loc synchronized.method.problem.descriptor=Method ''{0}()'' declared #ref #loc synchronized.method.include.option=Include native methods -synchronized.method.ignore.synchronized.super.option=Ignore overrides synchronized methods +synchronized.method.ignore.synchronized.super.option=Ignore methods overriding a synchronized method synchronized.method.move.quickfix=Move synchronization into method thread.run.replace.quickfix=Replace with 'start()' volatile.field.problem.descriptor=Volatile field #ref of type ''{0}'' #loc @@ -1897,6 +1897,7 @@ arrays.hash.code.quickfix=Replace with 'Arrays.hashCode()' method.can.be.variable.arity.method.display.name=Method can be variable arity method method.can.be.variable.arity.method.problem.descriptor=#ref() can be converted to variable arity method #loc method.can.be.variable.arity.method.ignore.byte.short.option=Ignore methods with a last parameter of type byte[] or short[] +method.can.be.variable.arity.method.ignore.overriding.methods=Ignore methods overriding a super method convert.to.variable.arity.method.quickfix=Convert to variable arity method mismatched.string.builder.query.update.display.name=Mismatched query and update of StringBuilder mismatched.string.builder.updated.problem.descriptor=Contents of {0} #ref are updated, but never queried #loc diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspection.java index 1c171d52fc5d..f4ea3c7365a2 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 Bas Leijdekkers + * Copyright 2011-2013 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,11 +16,11 @@ package com.siyeh.ig.migration; import com.intellij.codeInspection.ProblemDescriptor; -import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel; +import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel; import com.intellij.openapi.project.Project; import com.intellij.psi.*; +import com.intellij.psi.search.searches.SuperMethodsSearch; import com.intellij.psi.util.PsiUtil; -import com.intellij.util.IncorrectOperationException; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; @@ -36,26 +36,30 @@ public class MethodCanBeVariableArityMethodInspection extends BaseInspection { @SuppressWarnings({"PublicField"}) public boolean ignoreByteAndShortArrayParameters = false; + @SuppressWarnings("PublicField") + public boolean ignoreOverridingMethods = false; + @Nls @NotNull @Override public String getDisplayName() { - return InspectionGadgetsBundle.message( - "method.can.be.variable.arity.method.display.name"); + return InspectionGadgetsBundle.message("method.can.be.variable.arity.method.display.name"); } @NotNull @Override protected String buildErrorString(Object... infos) { - return InspectionGadgetsBundle.message( - "method.can.be.variable.arity.method.problem.descriptor"); + return InspectionGadgetsBundle.message("method.can.be.variable.arity.method.problem.descriptor"); } @Override public JComponent createOptionsPanel() { - return new SingleCheckboxOptionsPanel(InspectionGadgetsBundle.message( - "method.can.be.variable.arity.method.ignore.byte.short.option"), - this, "ignoreByteAndShortArrayParameters"); + final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); + panel.addCheckbox(InspectionGadgetsBundle.message("method.can.be.variable.arity.method.ignore.byte.short.option"), + "ignoreByteAndShortArrayParameters"); + panel.addCheckbox(InspectionGadgetsBundle.message("method.can.be.variable.arity.method.ignore.overriding.methods"), + "ignoreOverridingMethods"); + return panel; } @Override @@ -63,19 +67,16 @@ public class MethodCanBeVariableArityMethodInspection extends BaseInspection { return new MethodCanBeVariableArityMethodFix(); } - private static class MethodCanBeVariableArityMethodFix - extends InspectionGadgetsFix { + private static class MethodCanBeVariableArityMethodFix extends InspectionGadgetsFix { @NotNull @Override public String getName() { - return InspectionGadgetsBundle.message( - "convert.to.variable.arity.method.quickfix"); + return InspectionGadgetsBundle.message("convert.to.variable.arity.method.quickfix"); } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { + protected void doFix(Project project, ProblemDescriptor descriptor) { final PsiElement element = descriptor.getPsiElement(); final PsiElement parent = element.getParent(); if (!(parent instanceof PsiMethod)) { @@ -87,19 +88,15 @@ public class MethodCanBeVariableArityMethodInspection extends BaseInspection { return; } final PsiParameter[] parameters = parameterList.getParameters(); - final PsiParameter lastParameter = - parameters[parameters.length - 1]; + final PsiParameter lastParameter = parameters[parameters.length - 1]; final PsiType type = lastParameter.getType(); if (!(type instanceof PsiArrayType)) { return; } final PsiArrayType arrayType = (PsiArrayType)type; final PsiType componentType = arrayType.getComponentType(); - final PsiElementFactory factory = - JavaPsiFacade.getElementFactory(project); - final PsiTypeElement newTypeElement = - factory.createTypeElementFromText( - componentType.getCanonicalText() + "...", method); + final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); + final PsiTypeElement newTypeElement = factory.createTypeElementFromText(componentType.getCanonicalText() + "...", method); final PsiTypeElement typeElement = lastParameter.getTypeElement(); if (typeElement != null) { typeElement.replace(newTypeElement); @@ -112,8 +109,7 @@ public class MethodCanBeVariableArityMethodInspection extends BaseInspection { return new MethodCanBeVariableArityMethodVisitor(); } - private class MethodCanBeVariableArityMethodVisitor - extends BaseInspectionVisitor { + private class MethodCanBeVariableArityMethodVisitor extends BaseInspectionVisitor { @Override public void visitMethod(PsiMethod method) { @@ -126,8 +122,7 @@ public class MethodCanBeVariableArityMethodInspection extends BaseInspection { return; } final PsiParameter[] parameters = parameterList.getParameters(); - final PsiParameter lastParameter = - parameters[parameters.length - 1]; + final PsiParameter lastParameter = parameters[parameters.length - 1]; final PsiType type = lastParameter.getType(); if (!(type instanceof PsiArrayType)) { return; @@ -142,14 +137,16 @@ public class MethodCanBeVariableArityMethodInspection extends BaseInspection { return; } if (ignoreByteAndShortArrayParameters) { - if (PsiType.BYTE.equals(componentType) || - PsiType.SHORT.equals(componentType)) { + if (PsiType.BYTE.equals(componentType) || PsiType.SHORT.equals(componentType)) { return; } } if (LibraryUtil.isOverrideOfLibraryMethod(method)) { return; } + if (ignoreOverridingMethods && SuperMethodsSearch.search(method, null, true, false).findFirst() != null) { + return; + } registerMethodError(method); } } diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/MethodCanBeVariableArityMethod.html b/plugins/InspectionGadgets/src/inspectionDescriptions/MethodCanBeVariableArityMethod.html index 62d61cd226cd..4445fa8fcb39 100644 --- a/plugins/InspectionGadgets/src/inspectionDescriptions/MethodCanBeVariableArityMethod.html +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/MethodCanBeVariableArityMethod.html @@ -7,6 +7,10 @@ This inspection only reports if the project or module is configured to use a language level of 5.0 or higher.

+Use the first checkbox below to not offer to convert byte[] or short[] parameters to vararg. +

+Use the second checkbox below to ignore methods overriding a method in a super class. +

New in 10.5, Powered by InspectionGadgets \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/method_can_be_variable_arity_method/MethodCanBeVariableArity.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/method_can_be_variable_arity_method/MethodCanBeVariableArity.java index 4fd8268a94fe..db74d0cfc230 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/method_can_be_variable_arity_method/MethodCanBeVariableArity.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/method_can_be_variable_arity_method/MethodCanBeVariableArity.java @@ -17,4 +17,11 @@ abstract class MyInputStream extends Reader { public int read(char[] cbuf) throws IOException { return super.read(cbuf); } +} +class Sub extends MethodCanBeVariableArity { + + @Override + public void convertMe(String[] ss) { + super.convertMe(ss); + } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspectionTest.java index b07f6920fb2e..a54bd64d3b47 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspectionTest.java @@ -5,10 +5,9 @@ import com.siyeh.ig.IGInspectionTestCase; public class MethodCanBeVariableArityMethodInspectionTest extends IGInspectionTestCase { public void test() throws Exception { - final MethodCanBeVariableArityMethodInspection tool = - new MethodCanBeVariableArityMethodInspection(); + final MethodCanBeVariableArityMethodInspection tool = new MethodCanBeVariableArityMethodInspection(); tool.ignoreByteAndShortArrayParameters = true; - doTest("com/siyeh/igtest/migration/method_can_be_variable_arity_method", - tool); + tool.ignoreOverridingMethods = true; + doTest("com/siyeh/igtest/migration/method_can_be_variable_arity_method", tool); } } \ No newline at end of file From 282b5e2fc0bf4adb427f6d2b39c1de62f4089d36 Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 8 Mar 2013 14:35:14 +0400 Subject: [PATCH 49/57] cleanup --- .../jps/model/impl/JpsEventDispatcherBase.java | 2 +- .../java/impl/compiler/JpsCompilerExcludesImpl.java | 4 ++-- .../compiler/JpsJavaCompilerConfigurationImpl.java | 12 ++++++------ .../model/java/impl/compiler/ResourcePatterns.java | 2 +- .../jps/model/library/impl/JpsLibraryRole.java | 2 +- .../jps/model/module/impl/JpsModuleImpl.java | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsEventDispatcherBase.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsEventDispatcherBase.java index 7226b3854069..e36362b50dd8 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsEventDispatcherBase.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsEventDispatcherBase.java @@ -29,7 +29,7 @@ import java.util.Map; * @author nik */ public abstract class JpsEventDispatcherBase implements JpsEventDispatcher { - private Map, EventDispatcher> myDispatchers = new HashMap, EventDispatcher>(); + private final Map, EventDispatcher> myDispatchers = new HashMap, EventDispatcher>(); @NotNull @Override diff --git a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/JpsCompilerExcludesImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/JpsCompilerExcludesImpl.java index 315347621526..bd3a59974979 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/JpsCompilerExcludesImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/JpsCompilerExcludesImpl.java @@ -41,11 +41,11 @@ public class JpsCompilerExcludesImpl implements JpsCompilerExcludes { addExcludedDirectory(JpsPathUtil.urlToFile(url), recursively); } - public void addExcludedFile(File file) { + protected void addExcludedFile(File file) { myFiles.add(file); } - public void addExcludedDirectory(File dir, boolean recursively) { + protected void addExcludedDirectory(File dir, boolean recursively) { (recursively ? myRecursivelyExcludedDirectories : myDirectories).add(dir); } 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 dfebfa2ce83c..dbf5eac3529f 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 @@ -36,13 +36,13 @@ public class JpsJavaCompilerConfigurationImpl extends JpsCompositeElementBase ROLE = JpsElementChildRoleBase.create("compiler configuration"); private boolean myAddNotNullAssertions = true; private boolean myClearOutputDirectoryOnRebuild = true; - private JpsCompilerExcludes myCompilerExcludes = new JpsCompilerExcludesImpl(); - private List myResourcePatterns = new ArrayList(); - private List myAnnotationProcessingProfiles = new ArrayList(); - private ProcessorConfigProfileImpl myDefaultAnnotationProcessingProfile = new ProcessorConfigProfileImpl("Default"); + private final JpsCompilerExcludes myCompilerExcludes = new JpsCompilerExcludesImpl(); + private final List myResourcePatterns = new ArrayList(); + private final List myAnnotationProcessingProfiles = new ArrayList(); + private final ProcessorConfigProfileImpl myDefaultAnnotationProcessingProfile = new ProcessorConfigProfileImpl("Default"); private String myProjectByteCodeTargetLevel; - private Map myModulesByteCodeTargetLevels = new HashMap(); - private Map myCompilerOptions = new HashMap(); + private final Map myModulesByteCodeTargetLevels = new HashMap(); + private final Map myCompilerOptions = new HashMap(); private String myJavaCompilerId = "Javac"; private Map myAnnotationProcessingProfileMap; private ResourcePatterns myCompiledPatterns; diff --git a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/ResourcePatterns.java b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/ResourcePatterns.java index ed62fa4e6561..f1273621f823 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/ResourcePatterns.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/ResourcePatterns.java @@ -160,7 +160,7 @@ public class ResourcePatterns { return wildcardPattern; } - public static boolean isPatternNegated(String wildcardPattern) { + private static boolean isPatternNegated(String wildcardPattern) { return wildcardPattern.length() > 1 && wildcardPattern.charAt(0) == '!'; } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryRole.java b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryRole.java index 1c1492058878..0da1aadbfee1 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryRole.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryRole.java @@ -26,7 +26,7 @@ import org.jetbrains.jps.model.library.JpsLibraryListener; * @author nik */ public class JpsLibraryRole extends JpsElementChildRoleBase { - public static final JpsLibraryRole INSTANCE = new JpsLibraryRole(); + private static final JpsLibraryRole INSTANCE = new JpsLibraryRole(); public static final JpsElementCollectionRole LIBRARIES_COLLECTION_ROLE = JpsElementCollectionRole.create(INSTANCE); private JpsLibraryRole() { diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java index 8bf2845b136a..68fa7674ebda 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java @@ -40,7 +40,7 @@ import java.util.List; public class JpsModuleImpl

extends JpsNamedCompositeElementBase> implements JpsTypedModule

{ private static final JpsUrlListRole CONTENT_ROOTS_ROLE = new JpsUrlListRole("content roots"); private static final JpsUrlListRole EXCLUDED_ROOTS_ROLE = new JpsUrlListRole("excluded roots"); - public static final JpsElementChildRole DEPENDENCIES_LIST_CHILD_ROLE = JpsElementChildRoleBase.create("dependencies"); + private static final JpsElementChildRole DEPENDENCIES_LIST_CHILD_ROLE = JpsElementChildRoleBase.create("dependencies"); private final JpsModuleType

myModuleType; private final JpsLibraryCollection myLibraryCollection; From fe8f82782a1f72593e2593bf48a8e272f9daea76 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Fri, 8 Mar 2013 11:59:23 +0100 Subject: [PATCH 50/57] IDEA-94436 (Class does not overwrite toString() method shall have an option to ignore inner classes) --- .../ClassHasNoToStringMethodInspection.java | 42 +++++++---------- ...lassHasNoToStringMethodInspectionTest.java | 47 +++++++++++++++++++ 2 files changed, 64 insertions(+), 25 deletions(-) create mode 100644 plugins/generate-tostring/testSrc/org/jetbrains/generate/tostring/inspection/ClassHasNoToStringMethodInspectionTest.java diff --git a/plugins/generate-tostring/src/org/jetbrains/generate/tostring/inspection/ClassHasNoToStringMethodInspection.java b/plugins/generate-tostring/src/org/jetbrains/generate/tostring/inspection/ClassHasNoToStringMethodInspection.java index 95a165676c0f..3d6b64182590 100644 --- a/plugins/generate-tostring/src/org/jetbrains/generate/tostring/inspection/ClassHasNoToStringMethodInspection.java +++ b/plugins/generate-tostring/src/org/jetbrains/generate/tostring/inspection/ClassHasNoToStringMethodInspection.java @@ -33,12 +33,10 @@ import javax.swing.text.Document; import java.awt.*; /** - * Intention to check if the current class overrides the toString() method. + * Inspection to check if the current class overrides the toString() method. *

- * This inspection will use filter information from the settings to exclude certain fields (eg. constants etc.). - *

- * This inspection will only perform inspection if the class have fields to be dumped but - * does not have a toString method. + * This inspection will use filter information from the GenerateToString plugin settings to exclude certain fields (eg. constants etc.). + * Warns if the class has fields to be dumped and does not have a toString method. */ public class ClassHasNoToStringMethodInspection extends AbstractToStringInspection { @@ -55,6 +53,8 @@ public class ClassHasNoToStringMethodInspection extends AbstractToStringInspecti public boolean excludeTestCode = false; + public boolean excludeInnerClasses = false; + @NotNull public String getDisplayName() { return "Class does not override 'toString()' method"; @@ -74,35 +74,27 @@ public class ClassHasNoToStringMethodInspection extends AbstractToStringInspecti if (log.isDebugEnabled()) log.debug("checkClass: clazz=" + clazz); // must be a class - PsiIdentifier nameIdentifier = clazz.getNameIdentifier(); - if (nameIdentifier == null || clazz.getName() == null) - return; + final PsiIdentifier nameIdentifier = clazz.getNameIdentifier(); + if (nameIdentifier == null || clazz.getName() == null) { + return; + } - // must not be an exception if (excludeException && InheritanceUtil.isInheritor(clazz, CommonClassNames.JAVA_LANG_THROWABLE)) { - log.debug("This class is an exception"); return; } - - // must not be deprecated if (excludeDeprecated && clazz.isDeprecated()) { - log.debug("Class is deprecated"); return; } - - // must not be enum if (excludeEnum && clazz.isEnum()) { - log.debug("Class is an enum"); return; } - if (excludeAbstract && clazz.hasModifierProperty(PsiModifier.ABSTRACT)) { - log.debug("Class is abstract"); return; } - if (excludeTestCode && TestFrameworks.getInstance().isTestClass(clazz)) { - log.debug("Class is test class"); + return; + } + if (excludeInnerClasses && clazz.getContainingClass() != null) { return; } @@ -110,7 +102,6 @@ public class ClassHasNoToStringMethodInspection extends AbstractToStringInspecti if (StringUtil.isNotEmpty(excludeClassNames)) { String name = clazz.getName(); if (name != null && name.matches(excludeClassNames)) { - log.debug("This class is excluded"); return; } } @@ -118,7 +109,6 @@ public class ClassHasNoToStringMethodInspection extends AbstractToStringInspecti // must have fields PsiField[] fields = clazz.getFields(); if (fields.length == 0) { - log.debug("Class does not have any fields"); return; } @@ -155,8 +145,6 @@ public class ClassHasNoToStringMethodInspection extends AbstractToStringInspecti return; } } - if (log.isDebugEnabled()) log.debug("Class does not override toString() method: " + clazz.getQualifiedName()); - holder.registerProblem(nameIdentifier, "Class '" + clazz.getName() + "' does not override 'toString()' method", ProblemHighlightType.GENERIC_ERROR_OR_WARNING, GenerateToStringQuickFix.getInstance()); } @@ -227,9 +215,13 @@ public class ClassHasNoToStringMethodInspection extends AbstractToStringInspecti final CheckBox excludeInTestCodeCheckBox = new CheckBox("Ignore test classes", this, "excludeTestCode"); constraints.gridy = 5; - constraints.weighty = 1.0; panel.add(excludeInTestCodeCheckBox, constraints); + final CheckBox excludeInnerClasses = new CheckBox("Ignore inner classes", this, "excludeInnerClasses"); + constraints.gridy = 6; + constraints.weighty = 1.0; + panel.add(excludeInnerClasses, constraints); + return panel; } } diff --git a/plugins/generate-tostring/testSrc/org/jetbrains/generate/tostring/inspection/ClassHasNoToStringMethodInspectionTest.java b/plugins/generate-tostring/testSrc/org/jetbrains/generate/tostring/inspection/ClassHasNoToStringMethodInspectionTest.java new file mode 100644 index 000000000000..32f131c16645 --- /dev/null +++ b/plugins/generate-tostring/testSrc/org/jetbrains/generate/tostring/inspection/ClassHasNoToStringMethodInspectionTest.java @@ -0,0 +1,47 @@ +/* + * Copyright 2000-2013 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.generate.tostring.inspection; + +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; +import org.jetbrains.annotations.NonNls; + +/** + * @author Bas Leijdekkers + */ +public class ClassHasNoToStringMethodInspectionTest extends LightCodeInsightFixtureTestCase { + + public void testBasic() { + doTest("class X {" + + " private int i = 0;" + + "}"); + } + + public void testDoNotWarnOnInnerClass() { + doTest("class X {" + + " class Inner {" + + " private int i = 0;" + + " }" + + "}"); + } + + private void doTest(@NonNls String text) { + myFixture.configureByText("X.java", text); + final ClassHasNoToStringMethodInspection inspection = new ClassHasNoToStringMethodInspection(); + inspection.excludeInnerClasses = true; + myFixture.enableInspections(inspection); + myFixture.testHighlighting(true, false, false); + } +} From d75f9e6b25b306389295b31a8118f2b66b93151a Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Fri, 8 Mar 2013 12:26:07 +0100 Subject: [PATCH 51/57] IDEA-72638 ("Log statement not guarded by log condition" inspection should offer option to flag log statements with constant arguments for coding convention enforcement) --- .../src/com/siyeh/InspectionGadgetsBundle.properties | 1 + .../LogStatementGuardedByLogConditionInspection.java | 8 +++++++- .../LogStatementGuardedByLogCondition.html | 7 +++++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties index 3be454caa5c3..4841d4de6227 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties @@ -1713,6 +1713,7 @@ logging.condition.disagrees.with.log.statement.problem.descriptor=Logging condit log.statement.guarded.by.log.condition.display.name=Log statement not guarded by log condition log.statement.guarded.by.log.condition.problem.descriptor=#ref() log statement not guarded by log condition #loc log.statement.guarded.by.log.condition.quickfix=Surround with log condition +log.statement.guarded.by.log.condition.flag.all.unguarded.option=Flag all unguarded log statements key.set.iteration.may.use.entry.set.display.name=Iteration over 'keySet()' may be replaced with 'entrySet()' iteration key.set.iteration.may.use.entry.set.problem.descriptor=Iteration over #ref may be replaced with 'entrySet()' iteration #loc key.set.iteration.may.use.entry.set.quickfix=Replace with 'entrySet()' iteration diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/logging/LogStatementGuardedByLogConditionInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/logging/LogStatementGuardedByLogConditionInspection.java index 8a773ed83bf9..5402e0281d9a 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/logging/LogStatementGuardedByLogConditionInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/logging/LogStatementGuardedByLogConditionInspection.java @@ -25,6 +25,7 @@ import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; +import com.intellij.util.ui.CheckBox; import com.intellij.util.ui.FormBuilder; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; @@ -57,6 +58,9 @@ public class LogStatementGuardedByLogConditionInspection extends BaseInspection final List logMethodNameList = new ArrayList(); final List logConditionMethodNameList = new ArrayList(); + @SuppressWarnings("PublicField") + public boolean flagAllUnguarded = false; + public LogStatementGuardedByLogConditionInspection() { parseString(loggerMethodAndconditionMethodNames, logMethodNameList, logConditionMethodNameList); } @@ -84,6 +88,8 @@ public class LogStatementGuardedByLogConditionInspection extends BaseInspection InspectionGadgetsBundle.message("log.condition.text"))); panel.add(UiUtils.createAddRemovePanel(table), BorderLayout.CENTER); panel.add(FormBuilder.createFormBuilder().addLabeledComponent(classNameLabel, loggerClassNameField).getPanel(), BorderLayout.NORTH); + panel.add(new CheckBox(InspectionGadgetsBundle.message("log.statement.guarded.by.log.condition.flag.all.unguarded.option"), + this, "flagAllUnguarded"), BorderLayout.SOUTH); return panel; } @@ -216,7 +222,7 @@ public class LogStatementGuardedByLogConditionInspection extends BaseInspection return; } final PsiExpression firstArgument = arguments[0]; - if (PsiUtil.isConstantExpression(firstArgument)) { + if (!flagAllUnguarded && PsiUtil.isConstantExpression(firstArgument)) { return; } registerMethodCallError(expression); diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/LogStatementGuardedByLogCondition.html b/plugins/InspectionGadgets/src/inspectionDescriptions/LogStatementGuardedByLogCondition.html index bc16a72efc06..f031fc967795 100644 --- a/plugins/InspectionGadgets/src/inspectionDescriptions/LogStatementGuardedByLogCondition.html +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/LogStatementGuardedByLogCondition.html @@ -9,10 +9,13 @@ least serious level (trace, debug, finest) of logging statements, because those most often disabled in a production environment.

-Use the text field below to specify the logger class name used. Use the table -to specify the log methods this inspection should warn on, with the corresponding +Use the text field below to specify the logger class name used. +

+Use the table to specify the log methods this inspection should warn on, with the corresponding logging condition text.

+Use the checkbox below to let this inspection flag all unguarded log statements, not only those with non-constant arguments. +

New in 8, Powered by InspectionGadgets \ No newline at end of file From 38226e6ab4c5dc86608f0a41baeda3fbae446174 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Fri, 8 Mar 2013 12:49:40 +0100 Subject: [PATCH 52/57] IDEA-72636 ("Log statement not guarded by log condition" inspection fails on custom logging methods with method signatures different from log.debug(String)) --- ...StatementGuardedByLogConditionInspection.java | 16 ++++++++++++---- .../LogStatementGuardedByLogCondition.java | 6 ++++++ .../expected.xml | 7 +++++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/logging/LogStatementGuardedByLogConditionInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/logging/LogStatementGuardedByLogConditionInspection.java index 5402e0281d9a..95a1b73e0a11 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/logging/LogStatementGuardedByLogConditionInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/logging/LogStatementGuardedByLogConditionInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2008-2012 Bas Leijdekkers + * Copyright 2008-2013 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -221,9 +221,17 @@ public class LogStatementGuardedByLogConditionInspection extends BaseInspection if (arguments.length == 0) { return; } - final PsiExpression firstArgument = arguments[0]; - if (!flagAllUnguarded && PsiUtil.isConstantExpression(firstArgument)) { - return; + if (!flagAllUnguarded) { + boolean constant = true; + for (PsiExpression argument : arguments) { + if (!PsiUtil.isConstantExpression(argument)) { + constant = false; + break; + } + } + if (constant) { + return; + } } registerMethodCallError(expression); } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/logging/log_statement_guarded_by_log_condition/LogStatementGuardedByLogCondition.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/logging/log_statement_guarded_by_log_condition/LogStatementGuardedByLogCondition.java index b8f4f8c43443..dfb8c65cc7e0 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/logging/log_statement_guarded_by_log_condition/LogStatementGuardedByLogCondition.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/logging/log_statement_guarded_by_log_condition/LogStatementGuardedByLogCondition.java @@ -32,6 +32,10 @@ public class LogStatementGuardedByLogCondition { } } + void alternativeDebugMethodSignature(int i) { + LOG.debug(i, "asdfasdf"); + } + static class Logger { public Logger(String log) { @@ -40,6 +44,8 @@ public class LogStatementGuardedByLogCondition { public void debug(String s) { } + public void debug(int i, String s) {} + public void trace(String s) {} public boolean isDebug() { diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/logging/log_statement_guarded_by_log_condition/expected.xml b/plugins/InspectionGadgets/test/com/siyeh/igtest/logging/log_statement_guarded_by_log_condition/expected.xml index e04e666cf360..701ef7837e72 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/logging/log_statement_guarded_by_log_condition/expected.xml +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/logging/log_statement_guarded_by_log_condition/expected.xml @@ -14,4 +14,11 @@ Log statement not guarded by log condition <code>debug()</code> log statement not guarded by log condition #loc + + + LogStatementGuardedByLogCondition.java + 36 + Log statement not guarded by log condition + <code>debug()</code> log statement not guarded by log condition #loc + \ No newline at end of file From f52978b04e3c55f1e63819673b84e99520eae852 Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 8 Mar 2013 17:22:49 +0400 Subject: [PATCH 53/57] jps model: added API to save global settings --- .../JpsElementExtensionSerializerBase.java | 4 +- .../serialization/JpsGlobalElementSaver.java | 75 +++++++++++++++++++ .../model/serialization/JpsGlobalLoader.java | 10 +-- .../model/serialization/JpsLoaderBase.java | 3 - .../JpsSerializationManager.java | 3 + .../impl/JpsSerializationManagerImpl.java | 7 ++ .../JpsGlobalSerializationTest.java | 21 ++++-- 7 files changed, 106 insertions(+), 17 deletions(-) create mode 100644 jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalElementSaver.java diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsElementExtensionSerializerBase.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsElementExtensionSerializerBase.java index 3c13de8f85a0..db81ab260124 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsElementExtensionSerializerBase.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsElementExtensionSerializerBase.java @@ -24,8 +24,8 @@ import org.jetbrains.jps.model.JpsElement; * @author nik */ public abstract class JpsElementExtensionSerializerBase { - protected final String myConfigFileName; - protected final String myComponentName; + private final String myConfigFileName; + private final String myComponentName; protected JpsElementExtensionSerializerBase(@Nullable String configFileName, @NotNull String componentName) { myComponentName = componentName; diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalElementSaver.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalElementSaver.java new file mode 100644 index 000000000000..61cbd6dd76fd --- /dev/null +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalElementSaver.java @@ -0,0 +1,75 @@ +/* + * Copyright 2000-2013 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.serialization; + +import com.intellij.openapi.util.JDOMUtil; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.util.SystemProperties; +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.JDOMException; +import org.jetbrains.jps.model.JpsGlobal; + +import java.io.File; +import java.io.IOException; + +/** + * @author nik + */ +public class JpsGlobalElementSaver { + private static final JpsGlobalExtensionSerializer[] SERIALIZERS = { + new JpsGlobalLoader.GlobalLibrariesSerializer(), new JpsGlobalLoader.SdkTableSerializer() + }; + private final JpsGlobal myGlobal; + + public JpsGlobalElementSaver(JpsGlobal global) { + myGlobal = global; + } + + public static void saveGlobalElement(JpsGlobal global, String optionsPath) throws IOException { + File optionsDir = new File(FileUtil.toCanonicalPath(optionsPath)); + new JpsGlobalElementSaver(global).save(optionsDir); + } + + private void save(File optionsDir) throws IOException { + for (JpsGlobalExtensionSerializer serializer : SERIALIZERS) { + saveGlobalComponents(serializer, optionsDir); + } + } + + private void saveGlobalComponents(JpsGlobalExtensionSerializer serializer, File optionsDir) throws IOException { + String fileName = serializer.getConfigFileName(); + File configFile = new File(optionsDir, fileName != null ? fileName : "other.xml"); + Element rootElement = loadOrCreateRootElement(configFile); + serializer.saveExtension(myGlobal, JDomSerializationUtil.findOrCreateComponentElement(rootElement, serializer.getComponentName())); + JDOMUtil.writeDocument(new Document(rootElement), configFile, SystemProperties.getLineSeparator()); + } + + private static Element loadOrCreateRootElement(File configFile) { + if (!configFile.exists()) { + return new Element("application"); + } + try { + return JDOMUtil.loadDocument(configFile).getRootElement(); + } + catch (JDOMException e) { + throw new RuntimeException(e); + } + catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalLoader.java index aa6950dcf063..4f2e6e1241af 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalLoader.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalLoader.java @@ -45,7 +45,7 @@ public class JpsGlobalLoader extends JpsLoaderBase { public static final String FILE_TYPES_COMPONENT_NAME_KEY = "jps.file.types.component.name"; private final JpsGlobal myGlobal; - public JpsGlobalLoader(JpsGlobal global, Map pathVariables) { + private JpsGlobalLoader(JpsGlobal global, Map pathVariables) { super(new JpsMacroExpander(pathVariables)); myGlobal = global; global.getContainer().setChild(PATH_VARIABLES_ROLE, JpsElementFactory.getInstance().createSimpleElement(pathVariables)); @@ -78,8 +78,8 @@ public class JpsGlobalLoader extends JpsLoaderBase { loadComponents(optionsDir, "other.xml", serializer, myGlobal); } - private static class GlobalLibrariesSerializer extends JpsGlobalExtensionSerializer { - private GlobalLibrariesSerializer() { + public static class GlobalLibrariesSerializer extends JpsGlobalExtensionSerializer { + public GlobalLibrariesSerializer() { super("applicationLibraries.xml", "libraryTable"); } @@ -94,8 +94,8 @@ public class JpsGlobalLoader extends JpsLoaderBase { } } - private static class SdkTableSerializer extends JpsGlobalExtensionSerializer { - private SdkTableSerializer() { + public static class SdkTableSerializer extends JpsGlobalExtensionSerializer { + public SdkTableSerializer() { super("jdk.table.xml", SDK_TABLE_COMPONENT_NAME); } diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLoaderBase.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLoaderBase.java index a19e607f9161..e35bbb81717c 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLoaderBase.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLoaderBase.java @@ -15,10 +15,8 @@ */ package org.jetbrains.jps.model.serialization; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.JDOMUtil; import com.intellij.openapi.util.SystemInfo; -import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtilRt; import org.jdom.Element; import org.jdom.JDOMException; @@ -31,7 +29,6 @@ import java.io.IOException; * @author nik */ public abstract class JpsLoaderBase { - private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.model.serialization.JpsLoaderBase"); private final JpsMacroExpander myMacroExpander; protected JpsLoaderBase(JpsMacroExpander macroExpander) { diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSerializationManager.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSerializationManager.java index 3688fff08537..7b6bc86f68f9 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSerializationManager.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSerializationManager.java @@ -17,6 +17,7 @@ package org.jetbrains.jps.model.serialization; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.JpsGlobal; import org.jetbrains.jps.model.JpsModel; import org.jetbrains.jps.service.JpsServiceManager; @@ -34,4 +35,6 @@ public abstract class JpsSerializationManager { @NotNull public abstract JpsModel loadModel(@NotNull String projectPath, @Nullable String optionsPath, @NotNull Map pathVariables) throws IOException; + + public abstract void saveGlobalSettings(@NotNull JpsGlobal global, @NotNull String optionsPath) throws IOException; } diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsSerializationManagerImpl.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsSerializationManagerImpl.java index ee02ae647b29..dc04e77e4abf 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsSerializationManagerImpl.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsSerializationManagerImpl.java @@ -18,7 +18,9 @@ package org.jetbrains.jps.model.serialization.impl; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsElementFactory; +import org.jetbrains.jps.model.JpsGlobal; import org.jetbrains.jps.model.JpsModel; +import org.jetbrains.jps.model.serialization.JpsGlobalElementSaver; import org.jetbrains.jps.model.serialization.JpsGlobalLoader; import org.jetbrains.jps.model.serialization.JpsProjectLoader; import org.jetbrains.jps.model.serialization.JpsSerializationManager; @@ -41,4 +43,9 @@ public class JpsSerializationManagerImpl extends JpsSerializationManager { JpsProjectLoader.loadProject(model.getProject(), pathVariables, projectPath); return model; } + + @Override + public void saveGlobalSettings(@NotNull JpsGlobal global, @NotNull String optionsPath) throws IOException { + JpsGlobalElementSaver.saveGlobalElement(global, optionsPath); + } } diff --git a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsGlobalSerializationTest.java b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsGlobalSerializationTest.java index 98536ddde1a8..91b335376a27 100644 --- a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsGlobalSerializationTest.java +++ b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsGlobalSerializationTest.java @@ -15,12 +15,12 @@ */ package org.jetbrains.jps.model.serialization; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.testFramework.PlatformTestUtil; import org.jdom.Element; import org.jdom.JDOMException; import org.jetbrains.jps.model.JpsEncodingConfigurationService; import org.jetbrains.jps.model.library.JpsLibrary; -import org.jetbrains.jps.model.serialization.library.JpsSdkTableSerializer; import java.io.File; import java.io.IOException; @@ -32,7 +32,7 @@ import java.util.List; public class JpsGlobalSerializationTest extends JpsSerializationTestCase { private static final String OPTIONS_DIR = "jps/model-serialization/testData/config/options"; - public void testLoadSdks() { + public void testLoadSdksAndGlobalLibraries() { loadGlobalSettings(OPTIONS_DIR); final List libraries = myModel.getGlobal().getLibraryCollection().getLibraries(); assertEquals(3, libraries.size()); @@ -43,13 +43,20 @@ public class JpsGlobalSerializationTest extends JpsSerializationTestCase { assertEquals("1.6", sdk2.getName()); } - public void testSaveSdks() throws JDOMException, IOException { + public void testSaveSdksAndGlobalLibraries() throws JDOMException, IOException { loadGlobalSettings(OPTIONS_DIR); - Element actual = new Element("component").setAttribute("name", "ProjectJdkTable"); - JpsSdkTableSerializer.saveSdks(myModel.getGlobal().getLibraryCollection(), actual); - File jdkTableFile = new File(getTestDataFileAbsolutePath(OPTIONS_DIR), "jdk.table.xml"); + File targetOptionsDir = FileUtil.createTempDirectory("options" ,null); + JpsSerializationManager.getInstance().saveGlobalSettings(myModel.getGlobal(), targetOptionsDir.getAbsolutePath()); + + File originalOptionsDir = new File(getTestDataFileAbsolutePath(OPTIONS_DIR)); + assertOptionsFilesEqual(originalOptionsDir, targetOptionsDir, "jdk.table.xml"); + assertOptionsFilesEqual(originalOptionsDir, targetOptionsDir, "applicationLibraries.xml"); + } + + private void assertOptionsFilesEqual(File originalOptionsDir, File targetOptionsDir, final String fileName) throws IOException { JpsMacroExpander expander = new JpsMacroExpander(getPathVariables()); - Element expected = JDomSerializationUtil.findComponent(JpsLoaderBase.loadRootElement(jdkTableFile, expander), "ProjectJdkTable"); + Element expected = JpsLoaderBase.loadRootElement(new File(originalOptionsDir, fileName), expander); + Element actual = JpsLoaderBase.loadRootElement(new File(targetOptionsDir, fileName), expander); PlatformTestUtil.assertElementsEqual(expected, actual); } From a59cf759f1c08e13dad686a5b1a0e167571ce6c0 Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 8 Mar 2013 19:41:17 +0400 Subject: [PATCH 54/57] don't save application settings before external build in tests as necessary settings are saved in CompilerTestUtil --- .../impl/src/com/intellij/compiler/impl/CompileDriver.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java index 28b06f5eb07d..b7caf23314a2 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java @@ -636,7 +636,9 @@ public class CompileDriver { if (useExtProcessBuild) { // ensure the project model seen by build process is up-to-date myProject.save(); - ApplicationManager.getApplication().saveSettings(); + if (!ApplicationManager.getApplication().isUnitTestMode()) { + ApplicationManager.getApplication().saveSettings(); + } } PsiDocumentManager.getInstance(myProject).commitAllDocuments(); FileDocumentManager.getInstance().saveAllDocuments(); From 2ef907c170225ef54a9b72f465424408fa3df8a9 Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 8 Mar 2013 19:42:38 +0400 Subject: [PATCH 55/57] jps: load path variables from config file --- .../compiler/server/BuildManager.java | 50 +---- .../proto/cmdline_remote_proto.proto | 1 - .../jetbrains/jps/api/CmdlineRemoteProto.java | 189 +----------------- .../jetbrains/jps/cmdline/BuildSession.java | 9 +- .../jps/cmdline/JpsModelLoaderImpl.java | 8 +- .../serialization/JpsGlobalElementSaver.java | 2 +- .../model/serialization/JpsGlobalLoader.java | 52 ++++- .../JpsModelSerializationDataService.java | 28 +++ .../JpsPathVariablesConfiguration.java | 37 ++++ .../JpsSerializationManager.java | 3 +- .../model/serialization/PathMacroUtil.java | 18 ++ .../JpsPathVariablesConfigurationImpl.java | 72 +++++++ .../impl/JpsSerializationManagerImpl.java | 10 +- .../testData/config/options/path.macros.xml | 7 + .../config/optionsAfterChange/path.macros.xml | 8 + .../JpsGlobalSerializationTest.java | 51 ++++- .../JpsSerializationTestCase.java | 9 +- .../org/jetbrains/jps/build/Standalone.java | 4 +- .../application/options/PathMacrosImpl.java | 27 +-- .../components/impl/BasePathMacroManager.java | 5 +- .../impl/ModulePathMacroManager.java | 2 +- .../ant/JpsAntArtifactBuilderTaskTest.java | 6 +- 22 files changed, 296 insertions(+), 302 deletions(-) create mode 100644 jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsPathVariablesConfiguration.java create mode 100644 jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsPathVariablesConfigurationImpl.java create mode 100644 jps/model-serialization/testData/config/options/path.macros.xml create mode 100644 jps/model-serialization/testData/config/optionsAfterChange/path.macros.xml diff --git a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java index fb9a68331a81..0957ead53e61 100644 --- a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java +++ b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java @@ -16,7 +16,6 @@ package com.intellij.compiler.server; import com.intellij.ProjectTopics; -import com.intellij.application.options.PathMacrosImpl; import com.intellij.compiler.CompilerWorkspaceConfiguration; import com.intellij.compiler.impl.javaCompiler.javac.JavacConfiguration; import com.intellij.compiler.server.impl.CompileServerClasspathManager; @@ -215,8 +214,6 @@ public class BuildManager implements ApplicationComponent{ private final ChannelGroup myAllOpenChannels = new DefaultChannelGroup("build-manager"); private final BuildMessageDispatcher myMessageDispatcher = new BuildMessageDispatcher(); private volatile int myListenPort = -1; - private volatile CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings myGlobals; - private int myGlobalsStamp = -1; @Nullable private final Charset mySystemCharset; @@ -376,7 +373,6 @@ public class BuildManager implements ApplicationComponent{ } public void clearState(Project project) { - myGlobals = null; final String projectPath = getProjectPath(project); synchronized (myProjectDataMap) { final ProjectData data = myProjectDataMap.get(projectPath); @@ -539,7 +535,10 @@ public class BuildManager implements ApplicationComponent{ return; } - final CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings globals = buildGlobalSettings(); + final CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings globals = + CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings.newBuilder() + .setGlobalOptionsPath(PathManager.getOptionsPath()) + .build(); CmdlineRemoteProto.Message.ControllerMessage.FSEvent currentFSChanges; final SequentialTaskExecutor projectTaskQueue; synchronized (myProjectDataMap) { @@ -688,47 +687,6 @@ public class BuildManager implements ApplicationComponent{ return "com.intellij.compiler.server.BuildManager"; } - private CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings buildGlobalSettings() { - final PathMacrosImpl pathVars = PathMacrosImpl.getInstanceEx(); - - final CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings cached = myGlobals; - if (cached != null && myGlobalsStamp == pathVars.getModificationStamp()) { - return cached; - } - myGlobals = null; // ensure the cache is cleared and stamp is current - myGlobalsStamp = pathVars.getModificationStamp(); - - final Map data = new HashMap(); - - for (Map.Entry entry : PathMacrosImpl.getGlobalSystemMacros().entrySet()) { - data.put(entry.getKey(), FileUtil.toSystemIndependentName(entry.getValue())); - } - - for (String name : pathVars.getAllMacroNames()) { - final String path = pathVars.getValue(name); - if (path != null) { - data.put(name, FileUtil.toSystemIndependentName(path)); - } - } - - final CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings.Builder cmdBuilder = - CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings.newBuilder(); - - cmdBuilder.setGlobalOptionsPath(PathManager.getOptionsPath()); - - if (!data.isEmpty()) { - for (Map.Entry entry : data.entrySet()) { - final String var = entry.getKey(); - final String value = entry.getValue(); - if (var != null && value != null) { - cmdBuilder.addPathVariable(CmdlineProtoUtil.createPair(var, value)); - } - } - } - - return myGlobals = cmdBuilder.build(); - } - private OSProcessHandler launchBuildProcess(Project project, final int port, final UUID sessionId) throws ExecutionException { final String compilerPath; final String vmExecutablePath; diff --git a/jps/jps-builders/proto/cmdline_remote_proto.proto b/jps/jps-builders/proto/cmdline_remote_proto.proto index 4023ca6d823c..3310a3b53b7c 100644 --- a/jps/jps-builders/proto/cmdline_remote_proto.proto +++ b/jps/jps-builders/proto/cmdline_remote_proto.proto @@ -42,7 +42,6 @@ message Message { } message GlobalSettings { - repeated KeyValuePair path_variable = 1; required string global_options_path = 5; } diff --git a/jps/jps-builders/src/org/jetbrains/jps/api/CmdlineRemoteProto.java b/jps/jps-builders/src/org/jetbrains/jps/api/CmdlineRemoteProto.java index 4d7b8cb35bdb..22e8f1658ddd 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/api/CmdlineRemoteProto.java +++ b/jps/jps-builders/src/org/jetbrains/jps/api/CmdlineRemoteProto.java @@ -1,19 +1,3 @@ -/* - * 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. - */ - // Generated by the protocol buffer compiler. DO NOT EDIT! // source: cmdline_remote_proto.proto @@ -1966,12 +1950,6 @@ public final class CmdlineRemoteProto { public interface GlobalSettingsOrBuilder extends com.google.protobuf.MessageLiteOrBuilder { - // repeated .org.jetbrains.jpsservice.Message.KeyValuePair path_variable = 1; - java.util.List - getPathVariableList(); - org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair getPathVariable(int index); - int getPathVariableCount(); - // required string global_options_path = 5; boolean hasGlobalOptionsPath(); String getGlobalOptionsPath(); @@ -1995,27 +1973,6 @@ public final class CmdlineRemoteProto { } private int bitField0_; - // repeated .org.jetbrains.jpsservice.Message.KeyValuePair path_variable = 1; - public static final int PATH_VARIABLE_FIELD_NUMBER = 1; - private java.util.List pathVariable_; - public java.util.List getPathVariableList() { - return pathVariable_; - } - public java.util.List - getPathVariableOrBuilderList() { - return pathVariable_; - } - public int getPathVariableCount() { - return pathVariable_.size(); - } - public org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair getPathVariable(int index) { - return pathVariable_.get(index); - } - public org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePairOrBuilder getPathVariableOrBuilder( - int index) { - return pathVariable_.get(index); - } - // required string global_options_path = 5; public static final int GLOBAL_OPTIONS_PATH_FIELD_NUMBER = 5; private java.lang.Object globalOptionsPath_; @@ -2049,7 +2006,6 @@ public final class CmdlineRemoteProto { } private void initFields() { - pathVariable_ = java.util.Collections.emptyList(); globalOptionsPath_ = ""; } private byte memoizedIsInitialized = -1; @@ -2061,12 +2017,6 @@ public final class CmdlineRemoteProto { memoizedIsInitialized = 0; return false; } - for (int i = 0; i < getPathVariableCount(); i++) { - if (!getPathVariable(i).isInitialized()) { - memoizedIsInitialized = 0; - return false; - } - } memoizedIsInitialized = 1; return true; } @@ -2074,9 +2024,6 @@ public final class CmdlineRemoteProto { public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { getSerializedSize(); - for (int i = 0; i < pathVariable_.size(); i++) { - output.writeMessage(1, pathVariable_.get(i)); - } if (((bitField0_ & 0x00000001) == 0x00000001)) { output.writeBytes(5, getGlobalOptionsPathBytes()); } @@ -2088,10 +2035,6 @@ public final class CmdlineRemoteProto { if (size != -1) return size; size = 0; - for (int i = 0; i < pathVariable_.size(); i++) { - size += com.google.protobuf.CodedOutputStream - .computeMessageSize(1, pathVariable_.get(i)); - } if (((bitField0_ & 0x00000001) == 0x00000001)) { size += com.google.protobuf.CodedOutputStream .computeBytesSize(5, getGlobalOptionsPathBytes()); @@ -2198,10 +2141,8 @@ public final class CmdlineRemoteProto { public Builder clear() { super.clear(); - pathVariable_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000001); globalOptionsPath_ = ""; - bitField0_ = (bitField0_ & ~0x00000002); + bitField0_ = (bitField0_ & ~0x00000001); return this; } @@ -2235,12 +2176,7 @@ public final class CmdlineRemoteProto { org.jetbrains.jps.api.CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings result = new org.jetbrains.jps.api.CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings(this); int from_bitField0_ = bitField0_; int to_bitField0_ = 0; - if (((bitField0_ & 0x00000001) == 0x00000001)) { - pathVariable_ = java.util.Collections.unmodifiableList(pathVariable_); - bitField0_ = (bitField0_ & ~0x00000001); - } - result.pathVariable_ = pathVariable_; - if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { to_bitField0_ |= 0x00000001; } result.globalOptionsPath_ = globalOptionsPath_; @@ -2250,16 +2186,6 @@ public final class CmdlineRemoteProto { public Builder mergeFrom(org.jetbrains.jps.api.CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings other) { if (other == org.jetbrains.jps.api.CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings.getDefaultInstance()) return this; - if (!other.pathVariable_.isEmpty()) { - if (pathVariable_.isEmpty()) { - pathVariable_ = other.pathVariable_; - bitField0_ = (bitField0_ & ~0x00000001); - } else { - ensurePathVariableIsMutable(); - pathVariable_.addAll(other.pathVariable_); - } - - } if (other.hasGlobalOptionsPath()) { setGlobalOptionsPath(other.getGlobalOptionsPath()); } @@ -2271,12 +2197,6 @@ public final class CmdlineRemoteProto { return false; } - for (int i = 0; i < getPathVariableCount(); i++) { - if (!getPathVariable(i).isInitialized()) { - - return false; - } - } return true; } @@ -2297,14 +2217,8 @@ public final class CmdlineRemoteProto { } break; } - case 10: { - org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair.Builder subBuilder = org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair.newBuilder(); - input.readMessage(subBuilder, extensionRegistry); - addPathVariable(subBuilder.buildPartial()); - break; - } case 42: { - bitField0_ |= 0x00000002; + bitField0_ |= 0x00000001; globalOptionsPath_ = input.readBytes(); break; } @@ -2314,99 +2228,10 @@ public final class CmdlineRemoteProto { private int bitField0_; - // repeated .org.jetbrains.jpsservice.Message.KeyValuePair path_variable = 1; - private java.util.List pathVariable_ = - java.util.Collections.emptyList(); - private void ensurePathVariableIsMutable() { - if (!((bitField0_ & 0x00000001) == 0x00000001)) { - pathVariable_ = new java.util.ArrayList(pathVariable_); - bitField0_ |= 0x00000001; - } - } - - public java.util.List getPathVariableList() { - return java.util.Collections.unmodifiableList(pathVariable_); - } - public int getPathVariableCount() { - return pathVariable_.size(); - } - public org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair getPathVariable(int index) { - return pathVariable_.get(index); - } - public Builder setPathVariable( - int index, org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair value) { - if (value == null) { - throw new NullPointerException(); - } - ensurePathVariableIsMutable(); - pathVariable_.set(index, value); - - return this; - } - public Builder setPathVariable( - int index, org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair.Builder builderForValue) { - ensurePathVariableIsMutable(); - pathVariable_.set(index, builderForValue.build()); - - return this; - } - public Builder addPathVariable(org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair value) { - if (value == null) { - throw new NullPointerException(); - } - ensurePathVariableIsMutable(); - pathVariable_.add(value); - - return this; - } - public Builder addPathVariable( - int index, org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair value) { - if (value == null) { - throw new NullPointerException(); - } - ensurePathVariableIsMutable(); - pathVariable_.add(index, value); - - return this; - } - public Builder addPathVariable( - org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair.Builder builderForValue) { - ensurePathVariableIsMutable(); - pathVariable_.add(builderForValue.build()); - - return this; - } - public Builder addPathVariable( - int index, org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair.Builder builderForValue) { - ensurePathVariableIsMutable(); - pathVariable_.add(index, builderForValue.build()); - - return this; - } - public Builder addAllPathVariable( - java.lang.Iterable values) { - ensurePathVariableIsMutable(); - super.addAll(values, pathVariable_); - - return this; - } - public Builder clearPathVariable() { - pathVariable_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000001); - - return this; - } - public Builder removePathVariable(int index) { - ensurePathVariableIsMutable(); - pathVariable_.remove(index); - - return this; - } - // required string global_options_path = 5; private java.lang.Object globalOptionsPath_ = ""; public boolean hasGlobalOptionsPath() { - return ((bitField0_ & 0x00000002) == 0x00000002); + return ((bitField0_ & 0x00000001) == 0x00000001); } public String getGlobalOptionsPath() { java.lang.Object ref = globalOptionsPath_; @@ -2422,19 +2247,19 @@ public final class CmdlineRemoteProto { if (value == null) { throw new NullPointerException(); } - bitField0_ |= 0x00000002; + bitField0_ |= 0x00000001; globalOptionsPath_ = value; return this; } public Builder clearGlobalOptionsPath() { - bitField0_ = (bitField0_ & ~0x00000002); + bitField0_ = (bitField0_ & ~0x00000001); globalOptionsPath_ = getDefaultInstance().getGlobalOptionsPath(); return this; } void setGlobalOptionsPath(com.google.protobuf.ByteString value) { - bitField0_ |= 0x00000002; + bitField0_ |= 0x00000001; globalOptionsPath_ = value; } diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java index 61fa904eb21e..e638739b6cda 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java @@ -81,14 +81,7 @@ final class BuildSession implements Runnable, CanceledStatus { mySessionId = sessionId; myChannel = channel; - // globals - Map pathVars = new HashMap(); final CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings globals = params.getGlobalSettings(); - for (CmdlineRemoteProto.Message.KeyValuePair variable : globals.getPathVariableList()) { - pathVars.put(variable.getKey(), variable.getValue()); - } - - // session params myProjectPath = FileUtil.toCanonicalPath(params.getProjectId()); String globalOptionsPath = FileUtil.toCanonicalPath(globals.getGlobalOptionsPath()); myBuildType = convertCompileType(params.getBuildType()); @@ -99,7 +92,7 @@ final class BuildSession implements Runnable, CanceledStatus { builderParams.put(pair.getKey(), pair.getValue()); } myInitialFSDelta = delta; - JpsModelLoaderImpl loader = new JpsModelLoaderImpl(myProjectPath, globalOptionsPath, pathVars, null); + JpsModelLoaderImpl loader = new JpsModelLoaderImpl(myProjectPath, globalOptionsPath, null); myForceModelLoading = Boolean.parseBoolean(builderParams.get(BuildMain.FORCE_MODEL_LOADING_PARAMETER.toString())); myBuildRunner = new BuildRunner(loader, scopes, filePaths, builderParams); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/JpsModelLoaderImpl.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/JpsModelLoaderImpl.java index 0a99678323ea..5ad11fdaf8b6 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/JpsModelLoaderImpl.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/JpsModelLoaderImpl.java @@ -22,7 +22,6 @@ import org.jetbrains.jps.model.JpsModel; import org.jetbrains.jps.model.serialization.JpsSerializationManager; import java.io.IOException; -import java.util.Map; /** * @author nik @@ -31,14 +30,11 @@ public class JpsModelLoaderImpl implements JpsModelLoader { private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.cmdline.JpsModelLoaderImpl"); private final String myProjectPath; private final String myGlobalOptionsPath; - private final Map myPathVars; private final ParameterizedRunnable myModelInitializer; - public JpsModelLoaderImpl(String projectPath, String globalOptionsPath, Map pathVars, - @Nullable ParameterizedRunnable initializer) { + public JpsModelLoaderImpl(String projectPath, String globalOptionsPath, @Nullable ParameterizedRunnable initializer) { myProjectPath = projectPath; myGlobalOptionsPath = globalOptionsPath; - myPathVars = pathVars; myModelInitializer = initializer; } @@ -46,7 +42,7 @@ public class JpsModelLoaderImpl implements JpsModelLoader { public JpsModel loadModel() throws IOException { final long start = System.currentTimeMillis(); LOG.info("Loading model: project path = " + myProjectPath + ", global options path = " + myGlobalOptionsPath); - final JpsModel model = JpsSerializationManager.getInstance().loadModel(myProjectPath, myGlobalOptionsPath, myPathVars); + final JpsModel model = JpsSerializationManager.getInstance().loadModel(myProjectPath, myGlobalOptionsPath); if (myModelInitializer != null) { myModelInitializer.run(model); } diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalElementSaver.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalElementSaver.java index 61cbd6dd76fd..eee77c804894 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalElementSaver.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalElementSaver.java @@ -31,7 +31,7 @@ import java.io.IOException; */ public class JpsGlobalElementSaver { private static final JpsGlobalExtensionSerializer[] SERIALIZERS = { - new JpsGlobalLoader.GlobalLibrariesSerializer(), new JpsGlobalLoader.SdkTableSerializer() + new JpsGlobalLoader.PathVariablesSerializer(), new JpsGlobalLoader.GlobalLibrariesSerializer(), new JpsGlobalLoader.SdkTableSerializer() }; private final JpsGlobal myGlobal; diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalLoader.java index 4f2e6e1241af..2679adf5bc9a 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalLoader.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalLoader.java @@ -16,20 +16,22 @@ package org.jetbrains.jps.model.serialization; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.JDOMUtil; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.text.StringUtil; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsElementChildRole; -import org.jetbrains.jps.model.JpsElementFactory; import org.jetbrains.jps.model.JpsGlobal; -import org.jetbrains.jps.model.JpsSimpleElement; import org.jetbrains.jps.model.ex.JpsElementChildRoleBase; +import org.jetbrains.jps.model.serialization.impl.JpsPathVariablesConfigurationImpl; import org.jetbrains.jps.model.serialization.library.JpsLibraryTableSerializer; import org.jetbrains.jps.model.serialization.library.JpsSdkTableSerializer; import java.io.File; import java.io.IOException; +import java.util.Collections; import java.util.Map; /** @@ -38,7 +40,7 @@ import java.util.Map; public class JpsGlobalLoader extends JpsLoaderBase { private static final Logger LOG = Logger.getInstance(JpsGlobalLoader.class); public static final String SDK_TABLE_COMPONENT_NAME = "ProjectJdkTable"; - private static final JpsElementChildRole>> PATH_VARIABLES_ROLE = JpsElementChildRoleBase.create("path variables"); + public static final JpsElementChildRole PATH_VARIABLES_ROLE = JpsElementChildRoleBase.create("path variables"); private static final JpsGlobalExtensionSerializer[] SERIALIZERS = { new GlobalLibrariesSerializer(), new SdkTableSerializer(), new FileTypesSerializer() }; @@ -48,18 +50,19 @@ public class JpsGlobalLoader extends JpsLoaderBase { private JpsGlobalLoader(JpsGlobal global, Map pathVariables) { super(new JpsMacroExpander(pathVariables)); myGlobal = global; - global.getContainer().setChild(PATH_VARIABLES_ROLE, JpsElementFactory.getInstance().createSimpleElement(pathVariables)); } - public static void loadGlobalSettings(JpsGlobal global, Map pathVariables, String optionsPath) throws IOException { + public static void loadGlobalSettings(JpsGlobal global, String optionsPath) throws IOException { File optionsDir = new File(FileUtil.toCanonicalPath(optionsPath)); + new JpsGlobalLoader(global, Collections.emptyMap()).loadGlobalComponents(optionsDir, new PathVariablesSerializer()); + Map pathVariables = JpsModelSerializationDataService.getAllPathVariables(global); new JpsGlobalLoader(global, pathVariables).load(optionsDir); } @Nullable public static String getPathVariable(JpsGlobal global, String name) { - JpsSimpleElement> child = global.getContainer().getChild(PATH_VARIABLES_ROLE); - return child != null ? child.getData().get(name) : null; + JpsPathVariablesConfiguration configuration = JpsModelSerializationDataService.getPathVariablesConfiguration(global); + return configuration != null ? configuration.getPathVariable(name) : null; } private void load(File optionsDir) { @@ -78,6 +81,41 @@ public class JpsGlobalLoader extends JpsLoaderBase { loadComponents(optionsDir, "other.xml", serializer, myGlobal); } + public static class PathVariablesSerializer extends JpsGlobalExtensionSerializer { + public static final String MACRO_TAG = "macro"; + public static final String NAME_ATTRIBUTE = "name"; + public static final String VALUE_ATTRIBUTE = "value"; + + public PathVariablesSerializer() { + super("path.macros.xml", "PathMacrosImpl"); + } + + @Override + public void loadExtension(@NotNull JpsGlobal global, @NotNull Element componentTag) { + JpsPathVariablesConfiguration configuration = global.getContainer().setChild(PATH_VARIABLES_ROLE, new JpsPathVariablesConfigurationImpl()); + for (Element macroTag : JDOMUtil.getChildren(componentTag, MACRO_TAG)) { + String name = macroTag.getAttributeValue(NAME_ATTRIBUTE); + String value = macroTag.getAttributeValue(VALUE_ATTRIBUTE); + if (name != null && value != null) { + configuration.addPathVariable(name, StringUtil.trimEnd(FileUtil.toSystemIndependentName(value), "/")); + } + } + } + + @Override + public void saveExtension(@NotNull JpsGlobal global, @NotNull Element componentTag) { + JpsPathVariablesConfiguration configuration = JpsModelSerializationDataService.getPathVariablesConfiguration(global); + if (configuration != null) { + for (Map.Entry entry : configuration.getAllVariables().entrySet()) { + Element tag = new Element(MACRO_TAG); + tag.setAttribute(NAME_ATTRIBUTE, entry.getKey()); + tag.setAttribute(VALUE_ATTRIBUTE, entry.getValue()); + componentTag.addContent(tag); + } + } + } + } + public static class GlobalLibrariesSerializer extends JpsGlobalExtensionSerializer { public GlobalLibrariesSerializer() { super("applicationLibraries.xml", "libraryTable"); diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializationDataService.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializationDataService.java index 07efe413868c..927bf8b32631 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializationDataService.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializationDataService.java @@ -17,18 +17,46 @@ package org.jetbrains.jps.model.serialization; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.JpsGlobal; import org.jetbrains.jps.model.JpsProject; import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.serialization.impl.JpsModuleSerializationDataExtensionImpl; +import org.jetbrains.jps.model.serialization.impl.JpsPathVariablesConfigurationImpl; import org.jetbrains.jps.model.serialization.impl.JpsProjectSerializationDataExtensionImpl; import org.jetbrains.jps.model.serialization.module.JpsModuleSerializationDataExtension; import java.io.File; +import java.util.HashMap; +import java.util.Map; /** * @author nik */ public class JpsModelSerializationDataService { + @NotNull + public static Map getAllPathVariables(JpsGlobal global) { + Map pathVariables = new HashMap(PathMacroUtil.getGlobalSystemMacros()); + JpsPathVariablesConfiguration configuration = getPathVariablesConfiguration(global); + if (configuration != null) { + pathVariables.putAll(configuration.getAllVariables()); + } + return pathVariables; + } + + @Nullable + public static JpsPathVariablesConfiguration getPathVariablesConfiguration(JpsGlobal global) { + return global.getContainer().getChild(JpsGlobalLoader.PATH_VARIABLES_ROLE); + } + + @NotNull + public static JpsPathVariablesConfiguration getOrCreatePathVariablesConfiguration(JpsGlobal global) { + JpsPathVariablesConfiguration child = global.getContainer().getChild(JpsGlobalLoader.PATH_VARIABLES_ROLE); + if (child == null) { + return global.getContainer().setChild(JpsGlobalLoader.PATH_VARIABLES_ROLE, new JpsPathVariablesConfigurationImpl()); + } + return child; + } + @Nullable public static JpsProjectSerializationDataExtension getProjectExtension(@NotNull JpsProject project) { diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsPathVariablesConfiguration.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsPathVariablesConfiguration.java new file mode 100644 index 000000000000..06917a5eef22 --- /dev/null +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsPathVariablesConfiguration.java @@ -0,0 +1,37 @@ +/* + * Copyright 2000-2013 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.serialization; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.JpsElement; + +import java.util.Map; + +/** + * @author nik + */ +public interface JpsPathVariablesConfiguration extends JpsElement { + void addPathVariable(@NotNull String name, @NotNull String value); + + void removePathVariable(@NotNull String name); + + @Nullable + String getPathVariable(@NotNull String name); + + @NotNull + Map getAllVariables(); +} diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSerializationManager.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSerializationManager.java index 7b6bc86f68f9..cb08c6ca80e2 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSerializationManager.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSerializationManager.java @@ -22,7 +22,6 @@ import org.jetbrains.jps.model.JpsModel; import org.jetbrains.jps.service.JpsServiceManager; import java.io.IOException; -import java.util.Map; /** * @author nik @@ -33,7 +32,7 @@ public abstract class JpsSerializationManager { } @NotNull - public abstract JpsModel loadModel(@NotNull String projectPath, @Nullable String optionsPath, @NotNull Map pathVariables) + public abstract JpsModel loadModel(@NotNull String projectPath, @Nullable String optionsPath) throws IOException; public abstract void saveGlobalSettings(@NotNull JpsGlobal global, @NotNull String optionsPath) throws IOException; diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/PathMacroUtil.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/PathMacroUtil.java index be0e60712f53..9dbd5d07fe9f 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/PathMacroUtil.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/PathMacroUtil.java @@ -15,10 +15,16 @@ */ package org.jetbrains.jps.model.serialization; +import com.intellij.openapi.application.PathManager; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.SystemProperties; +import com.intellij.util.containers.HashMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; import java.io.File; +import java.util.Map; /** * @author nik @@ -28,6 +34,7 @@ public class PathMacroUtil { @NonNls public static final String MODULE_DIR_MACRO_NAME = "MODULE_DIR"; @NonNls public static final String DIRECTORY_STORE_NAME = ".idea"; @NonNls public static final String APPLICATION_HOME_DIR = "APPLICATION_HOME_DIR"; + @NonNls public static final String USER_HOME_NAME = "USER_HOME"; @Nullable public static String getModuleDir(String moduleFilePath) { @@ -48,4 +55,15 @@ public class PathMacroUtil { } return moduleDir; } + + public static String getUserHome() { + return StringUtil.trimEnd(FileUtil.toSystemIndependentName(SystemProperties.getUserHome()), "/"); + } + + public static Map getGlobalSystemMacros() { + final Map map = new HashMap(); + map.put(APPLICATION_HOME_DIR, FileUtil.toSystemIndependentName(PathManager.getHomePath())); + map.put(USER_HOME_NAME, getUserHome()); + return map; + } } diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsPathVariablesConfigurationImpl.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsPathVariablesConfigurationImpl.java new file mode 100644 index 000000000000..432073790f2d --- /dev/null +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsPathVariablesConfigurationImpl.java @@ -0,0 +1,72 @@ +/* + * Copyright 2000-2013 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.serialization.impl; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.ex.JpsElementBase; +import org.jetbrains.jps.model.serialization.JpsPathVariablesConfiguration; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author nik + */ +public class JpsPathVariablesConfigurationImpl extends JpsElementBase implements JpsPathVariablesConfiguration { + private Map myPathVariables; + + public JpsPathVariablesConfigurationImpl() { + myPathVariables = new LinkedHashMap(); + } + + private JpsPathVariablesConfigurationImpl(Map pathVariables) { + myPathVariables = new LinkedHashMap(pathVariables); + } + + @NotNull + @Override + public JpsPathVariablesConfigurationImpl createCopy() { + return new JpsPathVariablesConfigurationImpl(myPathVariables); + } + + @Override + public void applyChanges(@NotNull JpsPathVariablesConfigurationImpl modified) { + } + + @Override + public void addPathVariable(@NotNull String name, @NotNull String value) { + myPathVariables.put(name, value); + } + + @Override + public void removePathVariable(@NotNull String name) { + myPathVariables.remove(name); + } + + @Nullable + @Override + public String getPathVariable(@NotNull String name) { + return myPathVariables.get(name); + } + + @NotNull + @Override + public Map getAllVariables() { + return Collections.unmodifiableMap(myPathVariables); + } +} diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsSerializationManagerImpl.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsSerializationManagerImpl.java index dc04e77e4abf..2971b8824b4b 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsSerializationManagerImpl.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsSerializationManagerImpl.java @@ -20,10 +20,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsElementFactory; import org.jetbrains.jps.model.JpsGlobal; import org.jetbrains.jps.model.JpsModel; -import org.jetbrains.jps.model.serialization.JpsGlobalElementSaver; -import org.jetbrains.jps.model.serialization.JpsGlobalLoader; -import org.jetbrains.jps.model.serialization.JpsProjectLoader; -import org.jetbrains.jps.model.serialization.JpsSerializationManager; +import org.jetbrains.jps.model.serialization.*; import java.io.IOException; import java.util.Map; @@ -34,12 +31,13 @@ import java.util.Map; public class JpsSerializationManagerImpl extends JpsSerializationManager { @NotNull @Override - public JpsModel loadModel(@NotNull String projectPath, @Nullable String optionsPath, @NotNull Map pathVariables) + public JpsModel loadModel(@NotNull String projectPath, @Nullable String optionsPath) throws IOException { JpsModel model = JpsElementFactory.getInstance().createModel(); if (optionsPath != null) { - JpsGlobalLoader.loadGlobalSettings(model.getGlobal(), pathVariables, optionsPath); + JpsGlobalLoader.loadGlobalSettings(model.getGlobal(), optionsPath); } + Map pathVariables = JpsModelSerializationDataService.getAllPathVariables(model.getGlobal()); JpsProjectLoader.loadProject(model.getProject(), pathVariables, projectPath); return model; } diff --git a/jps/model-serialization/testData/config/options/path.macros.xml b/jps/model-serialization/testData/config/options/path.macros.xml new file mode 100644 index 000000000000..d1bbc09ab21a --- /dev/null +++ b/jps/model-serialization/testData/config/options/path.macros.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/jps/model-serialization/testData/config/optionsAfterChange/path.macros.xml b/jps/model-serialization/testData/config/optionsAfterChange/path.macros.xml new file mode 100644 index 000000000000..e919f6d2a9b9 --- /dev/null +++ b/jps/model-serialization/testData/config/optionsAfterChange/path.macros.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsGlobalSerializationTest.java b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsGlobalSerializationTest.java index 91b335376a27..32f31d6eeacb 100644 --- a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsGlobalSerializationTest.java +++ b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsGlobalSerializationTest.java @@ -18,7 +18,6 @@ package org.jetbrains.jps.model.serialization; import com.intellij.openapi.util.io.FileUtil; import com.intellij.testFramework.PlatformTestUtil; import org.jdom.Element; -import org.jdom.JDOMException; import org.jetbrains.jps.model.JpsEncodingConfigurationService; import org.jetbrains.jps.model.library.JpsLibrary; @@ -43,21 +42,53 @@ public class JpsGlobalSerializationTest extends JpsSerializationTestCase { assertEquals("1.6", sdk2.getName()); } - public void testSaveSdksAndGlobalLibraries() throws JDOMException, IOException { + public void testSaveSdksAndGlobalLibraries() { loadGlobalSettings(OPTIONS_DIR); - File targetOptionsDir = FileUtil.createTempDirectory("options" ,null); - JpsSerializationManager.getInstance().saveGlobalSettings(myModel.getGlobal(), targetOptionsDir.getAbsolutePath()); - + File targetOptionsDir = saveGlobalSettings(); File originalOptionsDir = new File(getTestDataFileAbsolutePath(OPTIONS_DIR)); assertOptionsFilesEqual(originalOptionsDir, targetOptionsDir, "jdk.table.xml"); assertOptionsFilesEqual(originalOptionsDir, targetOptionsDir, "applicationLibraries.xml"); } - private void assertOptionsFilesEqual(File originalOptionsDir, File targetOptionsDir, final String fileName) throws IOException { - JpsMacroExpander expander = new JpsMacroExpander(getPathVariables()); - Element expected = JpsLoaderBase.loadRootElement(new File(originalOptionsDir, fileName), expander); - Element actual = JpsLoaderBase.loadRootElement(new File(targetOptionsDir, fileName), expander); - PlatformTestUtil.assertElementsEqual(expected, actual); + private File saveGlobalSettings() { + try { + File targetOptionsDir = FileUtil.createTempDirectory("options", null); + JpsSerializationManager.getInstance().saveGlobalSettings(myModel.getGlobal(), targetOptionsDir.getAbsolutePath()); + return targetOptionsDir; + } + catch (IOException e) { + throw new RuntimeException(e); + } + } + + public void testLoadPathVariables() { + loadGlobalSettings(OPTIONS_DIR); + JpsPathVariablesConfiguration configuration = JpsModelSerializationDataService.getPathVariablesConfiguration(myModel.getGlobal()); + assertNotNull(configuration); + assertEquals("/home/nik/.m2/repository", configuration.getPathVariable("MAVEN_REPOSITORY")); + assertEquals(1, configuration.getAllVariables().size()); + } + + public void testSavePathVariables() { + loadGlobalSettings(OPTIONS_DIR); + JpsPathVariablesConfiguration configuration = JpsModelSerializationDataService.getOrCreatePathVariablesConfiguration(myModel.getGlobal()); + configuration.addPathVariable("TOMCAT_HOME", "/home/nik/applications/tomcat"); + + File targetOptionsDir = saveGlobalSettings(); + File originalOptionsDir = new File(getTestDataFileAbsolutePath(OPTIONS_DIR + "AfterChange")); + assertOptionsFilesEqual(originalOptionsDir, targetOptionsDir, "path.macros.xml"); + } + + private void assertOptionsFilesEqual(File originalOptionsDir, File targetOptionsDir, final String fileName) { + try { + JpsMacroExpander expander = new JpsMacroExpander(getPathVariables()); + Element expected = JpsLoaderBase.loadRootElement(new File(originalOptionsDir, fileName), expander); + Element actual = JpsLoaderBase.loadRootElement(new File(targetOptionsDir, fileName), expander); + PlatformTestUtil.assertElementsEqual(expected, actual); + } + catch (IOException e) { + throw new RuntimeException(e); + } } public void testLoadEncoding() { diff --git a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsSerializationTestCase.java b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsSerializationTestCase.java index ccb003510295..b96dad8612d5 100644 --- a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsSerializationTestCase.java +++ b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsSerializationTestCase.java @@ -16,6 +16,7 @@ package org.jetbrains.jps.model.serialization; import com.intellij.application.options.PathMacrosImpl; +import com.intellij.openapi.application.PathManager; import com.intellij.openapi.application.ex.PathManagerEx; import com.intellij.openapi.util.io.FileUtilRt; import com.intellij.openapi.vfs.VfsUtilCore; @@ -65,7 +66,11 @@ public abstract class JpsSerializationTestCase extends JpsModelTestCase { try { String optionsPath = getTestDataFileAbsolutePath(optionsDir); Map pathVariables = getPathVariables(); - JpsGlobalLoader.loadGlobalSettings(myModel.getGlobal(), pathVariables, optionsPath); + JpsPathVariablesConfiguration configuration = JpsModelSerializationDataService.getOrCreatePathVariablesConfiguration(myModel.getGlobal()); + for (Map.Entry entry : pathVariables.entrySet()) { + configuration.addPathVariable(entry.getKey(), entry.getValue()); + } + JpsGlobalLoader.loadGlobalSettings(myModel.getGlobal(), optionsPath); } catch (IOException e) { throw new RuntimeException(e); @@ -74,7 +79,7 @@ public abstract class JpsSerializationTestCase extends JpsModelTestCase { protected Map getPathVariables() { Map variables = new HashMap(); - variables.put(PathMacrosImpl.APPLICATION_HOME_MACRO_NAME, PathManagerEx.getHomePath(getClass())); + variables.put(PathMacrosImpl.APPLICATION_HOME_MACRO_NAME, PathManager.getHomePath()); variables.put(PathMacrosImpl.USER_HOME_MACRO_NAME, SystemProperties.getUserHome()); return variables; } diff --git a/jps/standalone-builder/src/org/jetbrains/jps/build/Standalone.java b/jps/standalone-builder/src/org/jetbrains/jps/build/Standalone.java index ed66c43e7409..8c6de9834979 100644 --- a/jps/standalone-builder/src/org/jetbrains/jps/build/Standalone.java +++ b/jps/standalone-builder/src/org/jetbrains/jps/build/Standalone.java @@ -114,9 +114,7 @@ public class Standalone { initializer = new GroovyModelInitializer(scriptFile); } - Map pathVars = new HashMap(); - pathVars.put("USER_HOME", System.getProperty("user.home")); - JpsModelLoaderImpl loader = new JpsModelLoaderImpl(projectPath, globalOptionsPath, pathVars, initializer); + JpsModelLoaderImpl loader = new JpsModelLoaderImpl(projectPath, globalOptionsPath, initializer); BuildType buildType = incremental ? BuildType.MAKE : BuildType.PROJECT_REBUILD; Set modulesSet = new HashSet(Arrays.asList(modules)); List artifactsList = Arrays.asList(artifacts); diff --git a/platform/projectModel-impl/src/com/intellij/application/options/PathMacrosImpl.java b/platform/projectModel-impl/src/com/intellij/application/options/PathMacrosImpl.java index ed100e4dfed5..cbac00107c3b 100644 --- a/platform/projectModel-impl/src/com/intellij/application/options/PathMacrosImpl.java +++ b/platform/projectModel-impl/src/com/intellij/application/options/PathMacrosImpl.java @@ -17,7 +17,6 @@ package com.intellij.application.options; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.PathMacros; -import com.intellij.openapi.application.PathManager; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.components.ExpandMacroToPathMap; import com.intellij.openapi.diagnostic.Logger; @@ -25,15 +24,13 @@ import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.NamedJDOMExternalizable; import com.intellij.openapi.util.RoamingTypeDisabled; import com.intellij.openapi.util.WriteExternalException; -import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.util.SystemProperties; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashMap; import gnu.trove.THashSet; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.serialization.JpsGlobalLoader; import org.jetbrains.jps.model.serialization.PathMacroUtil; import java.util.*; @@ -50,12 +47,9 @@ public class PathMacrosImpl extends PathMacros implements ApplicationComponent, private final ReentrantReadWriteLock myLock = new ReentrantReadWriteLock(); private final List myIgnoredMacros = ContainerUtil.createLockFreeCopyOnWriteList(); - @NonNls - public static final String MACRO_ELEMENT = "macro"; - @NonNls - public static final String NAME_ATTR = "name"; - @NonNls - public static final String VALUE_ATTR = "value"; + public static final String MACRO_ELEMENT = JpsGlobalLoader.PathVariablesSerializer.MACRO_TAG; + public static final String NAME_ATTR = JpsGlobalLoader.PathVariablesSerializer.NAME_ATTRIBUTE; + public static final String VALUE_ATTR = JpsGlobalLoader.PathVariablesSerializer.VALUE_ATTRIBUTE; @NonNls public static final String IGNORED_MACRO_ELEMENT = "ignoredMacro"; @@ -68,7 +62,7 @@ public class PathMacrosImpl extends PathMacros implements ApplicationComponent, @NonNls public static final String MODULE_DIR_MACRO_NAME = PathMacroUtil.MODULE_DIR_MACRO_NAME; @NonNls - public static final String USER_HOME_MACRO_NAME = "USER_HOME"; + public static final String USER_HOME_MACRO_NAME = PathMacroUtil.USER_HOME_NAME; private static final Set SYSTEM_MACROS = new HashSet(); @NonNls public static final String EXT_FILE_NAME = "path.macros"; @@ -207,13 +201,6 @@ public class PathMacrosImpl extends PathMacros implements ApplicationComponent, } } - public static Map getGlobalSystemMacros() { - final Map map = new HashMap(); - map.put(APPLICATION_HOME_MACRO_NAME, PathManager.getHomePath()); - map.put(USER_HOME_MACRO_NAME, getUserHome()); - return map; - } - @Override public boolean isIgnoredMacroName(@NotNull String macro) { return myIgnoredMacros.contains(macro); @@ -393,8 +380,4 @@ public class PathMacrosImpl extends PathMacros implements ApplicationComponent, myLock.readLock().unlock(); } } - - public static String getUserHome() { - return StringUtil.trimEnd(FileUtil.toSystemIndependentName(SystemProperties.getUserHome()), "/"); - } } diff --git a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java index d26e94ee61fd..ed5457116938 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java @@ -31,6 +31,7 @@ import com.intellij.openapi.vfs.VirtualFileSystem; import com.intellij.util.containers.FactoryMap; import org.jdom.Element; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.serialization.PathMacroUtil; import java.util.*; @@ -78,7 +79,7 @@ public class BasePathMacroManager extends PathMacroManager { public ExpandMacroToPathMap getExpandMacroMap() { ExpandMacroToPathMap result = new ExpandMacroToPathMap(); - for (Map.Entry entry : PathMacrosImpl.getGlobalSystemMacros().entrySet()) { + for (Map.Entry entry : PathMacroUtil.getGlobalSystemMacros().entrySet()) { result.addMacroExpand(entry.getKey(), entry.getValue()); } getPathMacros().addMacroExpands(result); @@ -87,7 +88,7 @@ public class BasePathMacroManager extends PathMacroManager { protected ReplacePathToMacroMap getReplacePathMap() { ReplacePathToMacroMap result = new ReplacePathToMacroMap(); - for (Map.Entry entry : PathMacrosImpl.getGlobalSystemMacros().entrySet()) { + for (Map.Entry entry : PathMacroUtil.getGlobalSystemMacros().entrySet()) { result.addMacroReplacement(entry.getValue(), entry.getKey()); } getPathMacros().addMacroReplacements(result); diff --git a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/ModulePathMacroManager.java b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/ModulePathMacroManager.java index af0f884d88aa..0c24492f264a 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/ModulePathMacroManager.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/ModulePathMacroManager.java @@ -50,7 +50,7 @@ public class ModulePathMacroManager extends BasePathMacroManager { if (!myModule.isDisposed()) { final String modulePath = PathMacroUtil.getModuleDir(myModule.getModuleFilePath()); - addFileHierarchyReplacements(result, PathMacrosImpl.MODULE_DIR_MACRO_NAME, modulePath, PathMacrosImpl.getUserHome()); + addFileHierarchyReplacements(result, PathMacrosImpl.MODULE_DIR_MACRO_NAME, modulePath, PathMacroUtil.getUserHome()); } return result; diff --git a/plugins/ant/jps-plugin/testSrc/org/jetbrains/jps/ant/JpsAntArtifactBuilderTaskTest.java b/plugins/ant/jps-plugin/testSrc/org/jetbrains/jps/ant/JpsAntArtifactBuilderTaskTest.java index a2b43bb75b03..426604fdfe97 100644 --- a/plugins/ant/jps-plugin/testSrc/org/jetbrains/jps/ant/JpsAntArtifactBuilderTaskTest.java +++ b/plugins/ant/jps-plugin/testSrc/org/jetbrains/jps/ant/JpsAntArtifactBuilderTaskTest.java @@ -21,11 +21,11 @@ import com.intellij.openapi.util.io.FileUtil; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.incremental.artifacts.ArtifactBuilderTestCase; import org.jetbrains.jps.model.serialization.JpsGlobalLoader; +import org.jetbrains.jps.model.serialization.JpsModelSerializationDataService; import org.jetbrains.jps.model.serialization.PathMacroUtil; import java.io.File; import java.io.IOException; -import java.util.Collections; import java.util.Map; import static com.intellij.util.io.TestFileSystemBuilder.fs; @@ -43,8 +43,8 @@ public class JpsAntArtifactBuilderTaskTest extends ArtifactBuilderTestCase { } public void testSimple() throws IOException { - Map pathVariables = Collections.singletonMap(PathMacroUtil.APPLICATION_HOME_DIR, PathManager.getHomePath()); - JpsGlobalLoader.loadGlobalSettings(myModel.getGlobal(), pathVariables, getTestDataRootPath() + "/config/options"); + JpsModelSerializationDataService.getOrCreatePathVariablesConfiguration(myModel.getGlobal()).addPathVariable(PathMacroUtil.APPLICATION_HOME_DIR, PathManager.getHomePath()); + JpsGlobalLoader.loadGlobalSettings(myModel.getGlobal(), getTestDataRootPath() + "/config/options"); addJdk("1.6"); loadProject("ant-project"); rebuildAll(); From 4f916577e7a138235a835b1db986a1aad54e1a98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yann=20C=C3=A9bron?= Date: Fri, 8 Mar 2013 17:49:36 +0100 Subject: [PATCH 56/57] CR-IC-320 follow-up to 8ac3b41, do not skip when value= null --- xml/impl/src/com/intellij/xml/DefaultXmlExtension.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java b/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java index 8d5d28bd9809..36af0b3ccbe8 100644 --- a/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java +++ b/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java @@ -229,7 +229,7 @@ public class DefaultXmlExtension extends XmlExtension { rootTag.add(xmlAttribute); } else { final String value = xmlAttribute.getValue(); - if (value != null && !value.contains(namespace)) { + if (!StringUtil.notNullize(value).contains(namespace)) { if (StringUtil.isEmptyOrSpaces(value)) { xmlAttribute.setValue(pair); } else { From 794d4944d1e4bd6e15b5e372a7dae521bf03d13f Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 8 Mar 2013 21:16:34 +0100 Subject: [PATCH 57/57] fix code review notes by delaying creation of second instance processing thread; fix confused variables in message --- native/WinLauncher/WinLauncher/WinLauncher.cpp | 9 ++++++--- native/WinLauncher/WinLauncher/WinLauncher.vcxproj | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/native/WinLauncher/WinLauncher/WinLauncher.cpp b/native/WinLauncher/WinLauncher/WinLauncher.cpp index 8c1fa3f0a858..0d4cf2154176 100644 --- a/native/WinLauncher/WinLauncher/WinLauncher.cpp +++ b/native/WinLauncher/WinLauncher/WinLauncher.cpp @@ -124,8 +124,8 @@ bool FindJVMInEnvVar(const char* envVarName, bool& result) else { char buf[_MAX_PATH]; - sprintf_s(buf, "The environment variable %s (with the value of %s) does not point to a valid JVM installation", - envVarValue, jvmPath); + sprintf_s(buf, "The environment variable %s (with the value of %s) does not point to a valid JVM installation.", + envVarName, envVarValue); MessageBoxA(NULL, buf, "Error Launching IntelliJ Platform", MB_OK); result = false; } @@ -553,7 +553,6 @@ bool CheckSingleInstance() { hFileMapping = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, FILE_MAPPING_SIZE, mappingName.c_str()); - hSingleInstanceWatcherThread = CreateThread(NULL, 0, SingleInstanceThread, NULL, 0, NULL); return true; } else @@ -704,6 +703,9 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, if (!LoadVMOptions()) return 1; if (!LoadJVMLibrary()) return 1; if (!CreateJVM()) return 1; + + hSingleInstanceWatcherThread = CreateThread(NULL, 0, SingleInstanceThread, NULL, 0, NULL); + if (!RunMainClass()) return 1; jvm->DestroyJavaVM(); @@ -716,3 +718,4 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, return 0; } + \ No newline at end of file diff --git a/native/WinLauncher/WinLauncher/WinLauncher.vcxproj b/native/WinLauncher/WinLauncher/WinLauncher.vcxproj index 6656ec535a2a..acbee35bbb63 100644 --- a/native/WinLauncher/WinLauncher/WinLauncher.vcxproj +++ b/native/WinLauncher/WinLauncher/WinLauncher.vcxproj @@ -64,7 +64,7 @@ true - C:\Java\jdk1.6.0_41\include;C:\Java\jdk1.6.0_41\include\win32;$(IncludePath) + C:\Java\jdk1.6.0_43\include;C:\Java\jdk1.6.0_43\include\win32;$(IncludePath) true @@ -72,7 +72,7 @@ false - C:\Java\jdk1.6.0_41\include;C:\Java\jdk1.6.0_41\include\win32;$(IncludePath) + C:\Java\jdk1.6.0_43\include;C:\Java\jdk1.6.0_43\include\win32;$(IncludePath) false