From 1f39da95149d57533bb08f15405fcfec9d13e05e Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Tue, 27 Jul 2010 18:53:47 +0400 Subject: [PATCH 01/82] CIDR: refactoring OCObjectType --- .../src/com/intellij/util/containers/ContainerUtil.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/platform/util/src/com/intellij/util/containers/ContainerUtil.java b/platform/util/src/com/intellij/util/containers/ContainerUtil.java index 72747aca1c59..ae0e7e6b4d4f 100644 --- a/platform/util/src/com/intellij/util/containers/ContainerUtil.java +++ b/platform/util/src/com/intellij/util/containers/ContainerUtil.java @@ -484,7 +484,7 @@ public class ContainerUtil { }; } - public static List concat(@NotNull final List... lists) { + public static List concat(@NotNull final List> lists) { int size = 0; for (List each : lists) { size += each.size(); @@ -508,6 +508,10 @@ public class ContainerUtil { }; } + public static List concat(@NotNull final List... lists) { + return concat(Arrays.asList(lists)); + } + public static List concat(Iterable list, Function> fun) { final ArrayList result = new ArrayList(); for (final V v : list) { From 168d489e88c4b71197e404f91816e1df1e7d2e60 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 27 Jul 2010 16:51:35 +0400 Subject: [PATCH 02/82] collapse hierarchy: do not push down supersuper twice --- .../usageInfo/ReplaceExtendsListUsageInfo.java | 10 +++++----- .../after/ISuper.java | 1 + .../after/Test.java | 1 + .../after/Test1.java | 2 ++ .../before/ISuper.java | 1 + .../before/Super.java | 1 + .../before/Test.java | 1 + .../before/Test1.java | 2 ++ .../com/intellij/refactoring/InlineSuperClassTest.java | 4 ++++ 9 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/after/ISuper.java create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/after/Test.java create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/after/Test1.java create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/before/ISuper.java create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/before/Super.java create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/before/Test.java create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/before/Test1.java diff --git a/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/usageInfo/ReplaceExtendsListUsageInfo.java b/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/usageInfo/ReplaceExtendsListUsageInfo.java index f9d28ac491b7..686950aaba32 100644 --- a/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/usageInfo/ReplaceExtendsListUsageInfo.java +++ b/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/usageInfo/ReplaceExtendsListUsageInfo.java @@ -21,22 +21,22 @@ package com.intellij.refactoring.inlineSuperClass.usageInfo; import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiJavaCodeReferenceElement; -import com.intellij.refactoring.safeDelete.usageInfo.SafeDeleteExtendsClassUsageInfo; import com.intellij.refactoring.util.FixableUsageInfo; import com.intellij.util.IncorrectOperationException; public class ReplaceExtendsListUsageInfo extends FixableUsageInfo { - private final SafeDeleteExtendsClassUsageInfo mySafeDeleteUsageInfo; public ReplaceExtendsListUsageInfo(PsiJavaCodeReferenceElement element, final PsiClass superClass, final PsiClass targetClass) { super(element); - mySafeDeleteUsageInfo = new SafeDeleteExtendsClassUsageInfo(element, superClass, targetClass); + } public void fixUsage() throws IncorrectOperationException { - if (mySafeDeleteUsageInfo.isSafeDelete()) { - mySafeDeleteUsageInfo.deleteElement(); + final PsiElement element = getElement(); + if (element != null) { + element.delete(); } } } diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/after/ISuper.java b/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/after/ISuper.java new file mode 100644 index 000000000000..42f94cf01d18 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/after/ISuper.java @@ -0,0 +1 @@ +interface ISuper {} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/after/Test.java b/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/after/Test.java new file mode 100644 index 000000000000..098860380992 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/after/Test.java @@ -0,0 +1 @@ +class Test implements ISuper {} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/after/Test1.java b/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/after/Test1.java new file mode 100644 index 000000000000..b312de86cba9 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/after/Test1.java @@ -0,0 +1,2 @@ +class Test1 implements ISuper { +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/before/ISuper.java b/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/before/ISuper.java new file mode 100644 index 000000000000..42f94cf01d18 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/before/ISuper.java @@ -0,0 +1 @@ +interface ISuper {} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/before/Super.java b/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/before/Super.java new file mode 100644 index 000000000000..7d430e36c1a6 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/before/Super.java @@ -0,0 +1 @@ +public interface Super extends ISuper{} diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/before/Test.java b/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/before/Test.java new file mode 100644 index 000000000000..22d8cb1d4203 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/before/Test.java @@ -0,0 +1 @@ +class Test implements Super {} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/before/Test1.java b/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/before/Test1.java new file mode 100644 index 000000000000..8bcdbacc6856 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/multipleSubclassesInheritsOneBaseBase/before/Test1.java @@ -0,0 +1,2 @@ +class Test1 implements Super{ +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/InlineSuperClassTest.java b/java/java-tests/testSrc/com/intellij/refactoring/InlineSuperClassTest.java index 81df809876c2..7b61e89605bd 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/InlineSuperClassTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/InlineSuperClassTest.java @@ -168,6 +168,10 @@ public class InlineSuperClassTest extends MultiFileTestCase { doTestMultipleSubclasses(); } + public void testMultipleSubclassesInheritsOneBaseBase() throws Exception { + doTestMultipleSubclasses(); + } + private void doTestMultipleSubclasses() throws Exception { doTest(new PerformAction() { public void performAction(final VirtualFile rootDir, final VirtualFile rootAfter) throws Exception { From 5897738dfc43638c9d9aa882d13037db27ef36f9 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 27 Jul 2010 18:52:32 +0400 Subject: [PATCH 03/82] inline parameter: safely inline recursive calls (IDEA-55529) --- .../inline/InlineParameterHandler.java | 13 +++++++++++-- .../inlineParameter/CantInlineRecursive.java | 18 ++++++++++++++++++ .../inlineParameter/InlineRecursive.java | 15 +++++++++++++++ .../inlineParameter/InlineRecursive.java.after | 15 +++++++++++++++ .../inline/InlineParameterTest.java | 15 +++++++++++++++ 5 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineParameter/CantInlineRecursive.java create mode 100644 java/java-tests/testData/refactoring/inlineParameter/InlineRecursive.java create mode 100644 java/java-tests/testData/refactoring/inlineParameter/InlineRecursive.java.after diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterHandler.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterHandler.java index d93340f4108d..6036192d3506 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterHandler.java @@ -99,8 +99,7 @@ public class InlineParameterHandler extends JavaInlineActionHandler { else if (!isSameConstant(argument, refConstantInitializer.get())) { return false; } - } - else { + } else if (!isRecursiveReferencedParameter(argument, psiParameter)) { if (!refConstantInitializer.isNull()) return false; refInitializer.set(argument); refMethodCall.set(methodCall); @@ -228,6 +227,16 @@ public class InlineParameterHandler extends JavaInlineActionHandler { return null; } + private static boolean isRecursiveReferencedParameter(final PsiExpression argument, final PsiParameter param) { + if (argument instanceof PsiReferenceExpression) { + final PsiElement element = ((PsiReferenceExpression)argument).resolve(); + if (element instanceof PsiParameter) { + return element.equals(param); + } + } + return false; + } + private static boolean isSameConstant(final PsiExpression expr1, final PsiExpression expr2) { boolean expr1Null = InlineToAnonymousConstructorProcessor.ourNullPattern.accepts(expr1); boolean expr2Null = InlineToAnonymousConstructorProcessor.ourNullPattern.accepts(expr2); diff --git a/java/java-tests/testData/refactoring/inlineParameter/CantInlineRecursive.java b/java/java-tests/testData/refactoring/inlineParameter/CantInlineRecursive.java new file mode 100644 index 000000000000..5c7474f10fd3 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineParameter/CantInlineRecursive.java @@ -0,0 +1,18 @@ +import java.lang.Integer; +import java.util.*; +import java.util.ArrayList; + +public class ExpData { + private final List myResult = new ArrayList(); + { + m(10, myResult); + } + + private void m(int i, List result) { + if (i > 0) { + m(i - 1, result); + } + result.add(i); + m(2, new ArrayList()); + } +} diff --git a/java/java-tests/testData/refactoring/inlineParameter/InlineRecursive.java b/java/java-tests/testData/refactoring/inlineParameter/InlineRecursive.java new file mode 100644 index 000000000000..88fb548ff33e --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineParameter/InlineRecursive.java @@ -0,0 +1,15 @@ +import java.util.*; + +public class ExpData { + private final List myResult = new ArrayList(); + { + m(10, myResult); + } + + private void m(int i, List result) { + if (i > 0) { + m(i - 1, result); + } + result.add(i); + } +} diff --git a/java/java-tests/testData/refactoring/inlineParameter/InlineRecursive.java.after b/java/java-tests/testData/refactoring/inlineParameter/InlineRecursive.java.after new file mode 100644 index 000000000000..ef341a34a8a5 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineParameter/InlineRecursive.java.after @@ -0,0 +1,15 @@ +import java.util.*; + +public class ExpData { + private final List myResult = new ArrayList(); + { + m(10); + } + + private void m(int i) { + if (i > 0) { + m(i - 1); + } + myResult.add(i); + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineParameterTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineParameterTest.java index 4e58558adc28..7c24c6971926 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineParameterTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineParameterTest.java @@ -250,6 +250,21 @@ public class InlineParameterTest extends LightCodeInsightTestCase { doTest(false); } + public void testInlineRecursive() throws Exception { + doTest(false); + } + + public void testCantInlineRecursive() throws Exception { + try { + doTest(false); + } + catch (CommonRefactoringUtil.RefactoringErrorHintException e) { + assertEquals("Cannot find constant initializer for parameter", e.getMessage()); + return; + } + fail("Initializer shoul not be found"); + } + public void testParameterDefWithWriteAccess() throws Exception { try { doTest(false); From 602039a74a150932f3a25041c8f9b05c4a912a17 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Tue, 27 Jul 2010 19:54:11 +0400 Subject: [PATCH 04/82] memleak: focus manager leaks due to awt leaking of frames --- .../com/intellij/openapi/wm/impl/FocusManagerImpl.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/FocusManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/FocusManagerImpl.java index d342ecdec454..d4b4ff2bf279 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/FocusManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/FocusManagerImpl.java @@ -38,6 +38,7 @@ import javax.swing.*; import java.awt.*; import java.awt.event.FocusEvent; import java.awt.event.KeyEvent; +import java.awt.event.WindowEvent; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Map; @@ -108,6 +109,14 @@ public class FocusManagerImpl extends IdeFocusManager implements Disposable { if (parent instanceof IdeFrame) { myLastFocused.put((IdeFrame)parent, c); } + } else if (e instanceof WindowEvent) { + if (e.getID() == WindowEvent.WINDOW_CLOSED) { + Window wnd = ((WindowEvent)e).getWindow(); + if (wnd instanceof IdeFrame) { + myLastFocused.remove(wnd); + myLastFocusedAtDeactivation.remove(wnd); + } + } } return false; From c12cfa652a45e14bd3e3d7f1080b8d18519db959 Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 27 Jul 2010 21:06:29 +0400 Subject: [PATCH 05/82] javac2 for nested forms fixed --- .../javac2/src/com/intellij/ant/Javac2.java | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/java/compiler/javac2/src/com/intellij/ant/Javac2.java b/java/compiler/javac2/src/com/intellij/ant/Javac2.java index 1eebd0171750..aea6261e8f2f 100644 --- a/java/compiler/javac2/src/com/intellij/ant/Javac2.java +++ b/java/compiler/javac2/src/com/intellij/ant/Javac2.java @@ -516,12 +516,23 @@ public class Javac2 extends Javac { } } if (myNestedFormDirs != null) { - for(Iterator it = myNestedFormDirs.iterator(); it.hasNext(); ) { - String path = (String) it.next(); - if (path.replace(File.separatorChar, '/').toLowerCase().endsWith(formFileFullName)) { - return loadForm(formFileName, new FileInputStream(path)); - } + String[] list = myNestedFormDirs.list(); + for (int i = 0, listLength = list.length; i < listLength; i++) { + String formPath = list[i]; + if (!formPath.endsWith("/")) { + formPath += "/"; } + if (formFileFullName.startsWith("/")) { + formPath += formFileName.substring(1); + } + else { + formPath += formFileName; + } + File formFile = new File(formPath.replace('/', File.separatorChar)); + if (formFile.isFile()) { + return loadForm(formFileName, new FileInputStream(formFile)); + } + } } InputStream resourceStream = myLoader.getResourceAsStream(formFileName); if (resourceStream != null) { From e87e21839dc95c2e10766ae2fc181c7290144d57 Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 27 Jul 2010 21:12:21 +0400 Subject: [PATCH 06/82] jps updated: compilation of nested forms fixed --- build/lib/gant/jps-sources.zip | Bin 34699 -> 35516 bytes build/lib/gant/lib/jps.jar | Bin 934927 -> 958118 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/build/lib/gant/jps-sources.zip b/build/lib/gant/jps-sources.zip index 156b692f32b023a9f6a1b26feef5351cb3f9e864..fdd2019888926a46841f5081ab84fd0246fd06ab 100644 GIT binary patch delta 15633 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 y%~hC{fmd!d==bNUA9Df;@qi8gloB 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

GRh`Z#z1YTc+s3oV^)lg$0AOT9 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 z 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%0D$H(LF?-<;qN1S_v@VK9sHlm7#-Wt^5 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%0A`UfemMI_=O$+(KXd7j#8g@qocIuqY09 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

%z%l}5 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 H5gOR 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%0A4-e>ji;jOe;Nt(94`&)F)g6V~CGa;;#l z)W<0G<5dTtto^fLV>hPGAg?V+uBMzuuDAl~B?`YeKRPjgD$94|@x#P1 zkm%y1({Rm+>-e3!^lkB?L>lR@qxr5qX*sDw}RBp=J3KU)!4+3DG; zkQki+S8V;y4{Kl;QqeY<;OD;gut#9T6^4oLqi2G*PpH1+pqTG%t{Q+IvBB(+ElwQ*#lxy$L!?7C#&bED~wl7<#xW92biWLT*&MlJSZy zK9fwEAGmsb+E={^@p25)vdU-TR_;lLj)5jXl4Ukg&R{6%=YVI#-~&$(m92j-5_2Ki zmFE^2ZBGfM)aH-Y2$EsPM0W~VB01pl_Nz0Yac2Amwzz84F5Fyh?1p|JJ6S)@d}j29 ze1Vs4z`WR7A$TP9i3DSs@sf&>8&;~&JEQ)nufIM7F|41$G8d z=wPf9cJn0=a>jL|1Np#1-CCyXKCU~d_i%i|9J~W|(fE$C=D9WuFBOL&9c};E83$DX z!{V*dP#6&eX`*ms<0iN2bo$6uJKl->>Ecrfy|Z-pyE#|CJSPAGy!BlfzRn-s6;!y5NRBNX+6nU&gl5t)aw))QIZ zK1G6BLzr-G1-?z^+z4x}fUObPsLBAO+4#iRbXURZM!$q}eh?0JIll~rUO2bH-L`Xf z;@(P~+41eAoZYo4rp$oq@T#5OwP~__8@IpGEl;^tuE7Csj+b8@%nuc1Ohf^+{|*#| zOvsdLOKl^RcP3BJlrztw1ybHh3cI5W57J?Oe1he7=?TK%pJ@kM%kCq(otn@O8Fco7coeIpEz z87QX@gNLKX=unH6&<>Yi8iI&Kt`;)@5e}Qv48!6YMtrhcHDVq2>9b7@fO?*PoayD* zK%>I`##(Ex(~2lSb)2>d)r) z&V$?*W)a==FSA$PFAT@MrFmhMJ7djO9t-m^Tr5{0Ez>G^P#h5D5U0T^%E4rj#A~uh z{B5yK9K+y;5N&lh)s`hEZ6aOPo*-KV<>${sFsf26agW&!6d_+LTEjvY!&7+y?{U(;$H|QWC z-^#~DVF_S9tchC5*Ta79KJ6h}`vv4P<{dJd;MJ0U{l>fY4wfgDbXLqaxZEaQOpGU4 zZYzMbm-!Mxb_{LkWr5Eny#B`0OtS=Xb@@fJkWl!YefoF)d-OqI{yUPhncXFl<_7I@ zy;|&0L<=f;LgNKX3+{h=`(Z4H>gVQ=fBhn*`N@L$Pg_=o_tTbDakzVF4W(_X%X!3q zVB?KB-Vvs0V>cU(LHz#hfNh9P7K$xvFTO_%PmzpGbwVF6ZLkJZR7{iTfNXXaNMxS} z%gn4@r-Lmh*r9)_*sj*{r@7IoKXsto9W(&LltRb`z?m8z_#16`?VSa z@LZ4*4cu$+1PKfPsBx~s%N-ho345st>3WG!V{NB}8)LT5r>PH=OLMoA&gWcBR7DjM zav5TvpaWlPm}|NiIi`uL$B}cy=wit=5&DRIB%=eP8qgE10<1k;#b}WxoF514 zp(UFM8yQ!((`6q>l>R_T*7qQRiPe9fse75q$@;SH>&XG0Y{SJIc{FGR!7oNd9LW0{ zjw&TlcUT!q`Ik&3tIqe$>I4jmdlxAg>^QN;x|8E1pL=P zXQo#Li<2rl=LT~Yx~)-N2x(cih<}5`j$xP9I2TPRc>P3?EEDec17uyEw1=w?TZ(0_ ze-<^`VlRQo1oP~mRU4?WflCpnEJKH6fFgrdpB`*>a4hC(mL+&meVul59Bk;|5<7x9 z${T<~a9Na*YoB6m2-!&xwvQ#SGu`kATQc1v)b2URYFMz(3YL*VpCiATB!2j`hlDX;> zxd?V}tlW-=b9!1G))C}+D;9K};35zUzaP*`fy(JYL;=$dg8o^d?E7kNJ}YyB$gfL2 zg-4vF-+5znY#Ik9U@L4N1!7(=gh+A_g99*R=Zb9-m&V*61~Cc51xN8X0BMCw5Wv+a zuh%NA2TOqr2t3$|Uk258x8@B(#3DhZw4*v|>F*Vsy~MN%vPPbA-N|nZ8BOa)qX(oV z8}5-Y#Jti(mzaYx|Gt+%WK#X7 zTnedMzv1%sU{1Cn<)fQ6nCToGTAx7_=7yZWOrkP**ANjQeEiACEl%nq9spTNobnkC zs$%e@vWtN=pX%pcx}lIb;e`0*WCw`A6b|sN%|Z4NCJ#A`bBWZ_*5;x)(qf>;4Hyag z_q*Ib4$IKQd`$6ed%U3^-Ybeen}5`XG8NM+3$nM1KC&R~E{9v3UvLNItkGCwGfH`ZNiX33mO>dF ziLh)eR^b^@WV1yNTT026G`NWnDFT%fEw5(ePjw#XNDzuHLLaRIQ9#7>;Q?cqg&pEw zk~dq!%&fZ7{v3U2QiILXMN6YerJG~3`bhd~*FOhzwO-C~dmADp=Cn5N*L@jA1p&d+dI35^XdRRAAIH)F7A7rQ*GL;#T_xA2h=s#C;}r}{&W%KT}ZY;cTVfq3>cH){(?-2ACi5nLB7VazPm6HMNl6gtDIA!~=kH4QFeeI&bqE zs+T6Dt&r_p9*YRPub%lgTNXF4uWZ>}S9RYXJJjCSwQS=NKyNwjQsS8;pJt96*HOxq zHklwK%Vsg;tl8{_;KL8(Go>`4bM`yt=H**tU^Lx-L$J)u3XbG`;p8p~n>Ye|V7iVu zn*?SpzN^hAN`qalcoYE42qy=E++hDCofOA92Rb?ZY?^@eJBlMUL0l4pn)CdtHqd3) zy_WI9y=5lANAUU7MRH6Ai);PWY6Gqje8zTHHxZR~57N{<|+IJnI*R35nLBk@bZ|+<>N{4$o=ia5X}Qmi1DdS)_q$ zm2Y)MCfL-$L5pNFp4}Y?2gqD zimZO3GY%y#NXFWebX#AhrHmjM^PTt|+5FWUp=b1V?-WhS$Pud}YsCw6p;S+Z4F=;T z2jw@PuX$rliWhN?usa6-h=JYhgYvNs+dK9}^J4LEy6wBLZ!HdgtZ7e%KrC8E^BZx5vVe)oK1!v}G{Fup7C;t-3 z&c$VapDvxNmuXW->I9S*TbsVeCD$7jNCxozVvRry5vKly)Bzvk^R=O;yOb0=6OCf( za!KhqHa2{kRvSrn7iu*dCt=Bn89=f!M)^xVx&XzBy&^w_m6!A2B+;-8n}s9!wk~ju zAh!py^uQ1WPwIpvB8C$W#|f&>o_11zBeH998Tx~#Wv2y-7F0CG0X(neu0)<|{u-b# zLq7SeJjn?OwK)!-$p(Au8a)t{RbZ!}vI+jOK~(DoLW>bJ@z*}9&F4>b2k8<|wc&KZ zteM8&eN2DInTT2Sf<`#?m7CLTkB!E~Kq;HLMWWxpV- zhT(mOnErpb+u)VAC*$Ci&nHU=CpQ3fJ0c__EaKHyabec103%+VxvGNNxq|iRev_DL z+#nj#A=MR9a&(Q6uv)ltxn7ua`N?Qs|84c&GYr3MUm3Nh03?o8*#1tzj0?exSl(g< zadq{upZH|KPLSQa;fM-FQV|upDJ!H#ayl&eTTjQ{XvKG6SRInG@+)?sGcrJ!B28@h znM?fH&s_<`jBLFP6Gb_%5R+IRgU7kpZbPw1I{~$|dQcB~G%M%oe#qh5RsOlm>*McM zrRo`BI_f?J5|5N^;TP>K5;}o|1xLUove-wzk=OzB#$|E1D+aBH#LE!oHAQW~;nyoY?ig4_h+K~`2X$L! zpc+YvaVeX%GsE7;I_3=eNB0;Hc*O9oatWG>UC8Y_=Xdv155TrnA>-R?$@1);$BhY( zl4Jv@Dfy7rbp;cKynT-ooYQ2T;pJMOR{w2y0hjmF2WI@ObY$^R=q2FbCYt;Dy5mWx zEaKw?e-UkPLmIT+chZQ2ohUL4yiu=-9Dl}$2)F4k>t&xgcjGFkQKT8I)LS~Tg)W|7lq!V+c)T-J?Y12 zdfQo>6?e0;moNjf+Z?fzV}uWP5DrG&S$%d=B93Bw7Lcr9N5*(Z#CRJen@zA0;mK(h zy6CaoD!(xNX$X$`|Ecx&YG4QPN!7c!m z77c}OG+|XnFX9XMGJu)jC+lzFM>v=~pYF~l-m*=CoY_qp#1#z7;=P)T)k67Oe4q@O zA*~-`TY`sW`w^A=J6AG)*6=4Fzvjx zRO88f?}SRK5p}9pXqxye(}*D=L8Lm5L2@Q$!zFYm4WM=sd6`kmMJ=#A!J56y{NLW_ zI)I2?6c-~!oBpaW-|0TpXr6?IXwdSIz8$?FA}M-8H8pmKtt}*ep3$<$)q}bA>KRy~ z62>-99X7TywU9RAY5hQJbaLYXyiJ;Ma|j;(ahE&#BSo-iFzN{nd3^yY&xk_af&4?Js>E! z`U$s;U_N}8UsomeV!m(rs#4wpp*Lo=@_iNyDtx+6V(Ur1IxUWG1mHJWYY>0HbYR|x zlts9GE?fkrQr5sOPCQG%r^k{`Soy*|*DJl|o-hxe4m$;iqimAXjoVD73N?5^TLB%8 zQ<{M$Q$gu05>x3xFGmnl=`vHAgNhSr=}mSHWvf^wyP{K-Ep#;uj#h({b#7ts&Tahz z(e)xPeq9e3$fnQ_0L?IWnrsIB>O$cU%yA6U6lV{5sBfPfYMcUUN$z0{SF&BV5p}Ob zlF)s2skGb-Q4P|WoI2_WiLa#kK0q;OnMSi(WzC60M4Ol6+@Y$YyX)K`tD`&I`HYqy z1XU|&p9FTWdqS4lellP9Dk*)DD9J<5rdNwi+-5sk!+sTM|E&RdG6aZ+K!QROgqAYQ z$iKf^h1Cu63421zrGr=~kUF8CiqRuYm)78GJB#>uwd@etyGxQ6R@4t4(S@$_$hvA3Umpoy+LQQm`AX_g#877@2ZjTvPCd{fQaCjBpf(-EBN@(BoZ=a*# zIZSAqJ=--sBuIkA^_>d-CzdrQu@psv{cojfz^NhkYt%#?CIjk|vebc)x#iF01--IU zuKS~zyO_GyC+Jq|=Z71P*?dl_$HuTtiU;#3)-WNQOS&9+i^JxvSw?VPyxfV9*v3J! zE6f{NEO9qPS1K#QLK49DtQh3D8UjurDcVMFgt7c?@sUc$8#(cqTqj;_b+eF4jG9ee zg4<^P64-ImkCgrb^erj{c1>SB4hOfP?ER;~r1&C!s&?uYqq(yhO`X^9Kov7po6peE$z%%OFhQ{ri3JMW?Wju)DVCFD*>!GzcSo6cQ~`GG3yD< zv(3GxAcwa43fpOJnr`7q$#!rEH$L$RhP&@yl!eK@Vf}e_a(O{%nBSVgjpfM0g!8AY zS|H0GET#&8N5mj5)g0|~a@Fw{qcWo7r@EIK!sa&Vz=JV<=KEd5yBW>e#9;Hm=Dcob z<|W1dPbI&*_Afx~k8_in7=TA`6Fk1uUsxo*Wm?35hivTCJzhh+-#JtIW*P&;@eahr zPfWarnQE-zBA9T@r$OT`o2tEYNZTj7D;98qfHHSvj}tUS`ivG)lOboR&h7Z;OSTWO zfYU)60?)DfR#W(VPBw)AHY$Ip(jDzn4K4W_z@!75H*gwwEE{)j)hd0b1Z*@8%X3g<2IuG%NII5Ar6% z#WyfaY*OVV=rSS6NltmX<=nk|q8h5-8x2m$^^TfJR%YUO^{Z&#s?#wM$Md%jrB>4S ze}e>&eq?C>O%kZf5`ohEag=xb`TyyoGsXT(AN>QP$NWJfsP#IZ`tKC1S!~ncqBcH7 zHNi=rk*24|Hg2a|?SwC16lf%4e#m^zk_M7~&f?AD{d1yq6$lFi%CKv2oz6_-U}^w- zeZ9fx;TQ*d{c{ZOhiSEr*f&tRxCt)p*q~G8$w71F(arR*(OWI{JTcdUZi|EE>ff~i z2)R}Fi=h{{1XB512Me0m7M^GSyGs`!sRjDW*nkH!NRK0ij5%QS6I$w}fL3jsGM1sg z&u4V)tw7~zLv%ya&n&5tpl^)`2a|&C6t4AjQM}J6%&4*OBV%NTo`gM8eldge2W+FamCzO5lGmWr_AV_C0W`!sLI9D6YJ9{}pQ|oJtAXn2H4L{D;_Qzfnuh1!; znVFC&&G)is#~7lpA#Yx3ScBS>mD@5=kBN)*SC=6hEsy_QfI(*+G0SpTYtgQl{tUsfT#xp zw_oVvr+<~NGr%cyAsokunI^WfSm!qaO##VJiw~VchGy6}@Cy)Tz**HtQp}SY*w^dW zIV;ha0v){Auq@62L~N9P1?%NA>YcMJNTGCmU6=~`muhTl_9dkYv&41=xvKf&RL^1I z^c$yZibxPH_wcTQkKw)mDh!bvfD1J5Bs+&O;Trpfn!X@31vL&$z2{)|m$ZNxtBtj~ z+R3gVfQx5QX9G(xUdiN5{z(E=2$4q&dWbdq0blO+0!Rp}=sM3GYHYTXpRB-9w0N$s z0=Mt!2Hp0Z;Rf!1s`PiSDXk`ds?hHTx%Gd!1}W`(U}z~X|EWYJ9k~U0bRXFFQY$d* zfiU0?QJeq;eqkK&J$R7eka)eoivBaj`sU(G;`=qezACn@)Y34lFp#~fFY-qo9X2#= zW@edf$LaS@-5K|{{o`fBUjuIAu`3MD8cf(t^0O|7`K%Rdnp^TT?jw!L92JR^`3+a( z(Ug7+!Y)b6;Q(#<$j;98u8J#mL@#JL#DyzdRpmK$Ah<55TOiTjAlcM z^oWF(`fqApTl2PHU(H}a1vW;LIXmAW#^aD4A7-MdTJ;cCc^U$Q~;Jg`OyJ=DJR=I>=DuMAEAs+ z?Zy$&sbjZs0m6CO2fL>$Igdn=;W@tr&uMHgkW+4nvQHp9b7_OQZ@O=^HX3L0sgkI%w!|eye+y`c28T{OPJOBP!MJ2bFa~zek zan8(z$Nq{N9{?#I%QP$tA9V<<2t~;!GCWc?C;$X4f`K5QEX-0;t~t;cJ6f+aAF<@?fQH2z8*sCo1ss$0d49{y_|h5(Z1T-|6v3r={xO$q>?3rD~wY?QL8&Qhf*uk$bv8+%j3CB8Q%3Mn_x zp(>aG-~3(%?+B#FiejDYLWfujj5gd-?>4n`-z$S~fgf2BlmrJg>1TJ4`lSnWuxpt=J1>#6AE!vhFab7Euc{*Q1P4f6lnoP2vm zB7g3>em?a7d3jeM4vWgp^=P}y3knJf3@R%MT6OTD{W;kgznGahN&Pu5owB$$`OvvY z_<8V=ul%_)@9+PSk9ho%sEi_%GVKPAr3_;rqi?EbY_tPiJxMhtPBSKLVzhHR30&?t zEkR8yOM@z}r)Qw2@B51s)P;WP_nI(CY0wzrl`l4H1G2d_d-@CFRj3bQvr{ea4}1 z0~BjGAujmrIygt||%vK%-n*qDekWD_5 zV%BbIt?W9H{1a!nP1(g}RF%^#sl7W7*%DsDsd^Ks|C(>v?DCr8;GnbyaCX@Jb6Y_z zBz43;%AInC5-1}u+i002*%?StZkcb2%U@C-moIBfSS2uyfPlVqk|U!cpxLsgB8;37cY`$iZwVo|xdJ^pQW-u%H8xaQp8vg0Jf0V2Lv7S; z4}RhHgutYm{}bJW!FAqF+kcHgGh|Pf0qLa_v$&ZkLWP^Nc(QR^we|yMhL6e!OuRxO z9HlWL_e@%o8=-2?ILq_1aDeJfw6qq3AY2eRXx6{`f2kV-XQpXje(-4XfBuWqf}is9 zKZFJRH?1X0S?53TXHvivb)#(lzWDgfO^EO!e&cEa)QST7dgXEi)FkMvS;RwcSKl}L zL29>oS#<^6ocl3~wwl-$eHg63$V=p7KJ5sR@e61sRl;iyU9m-LnAGMZ=sHB z?khXYTRR~7o@w+?7>y7WFpNvXF#GLF(7pO*MSnrkQpCdRmC9H)4|KsmQ}rDxy;@dV zhb|hKz4kOoGd^V94ap>wFgq^E8b7t!q1AKBbp(?bG1EV^qIh~b%YaW@ZtelP2o2MH zm>C+g$!gT4Bm6}h85>ph9MiIJY$jUsb2lrR^B4t&RTxJO2oJANr^3KygKYj}wTk+7 zSFAQ1L?TCq82o@Z{4%iCLfc9CY)Q6_&Yv3Yh z3#?7?jL^TzwAe?p9Ucv1X+Z(JFbvM_+PQAo%@;of+kV?~&^Eg#=T$fU zT$9uCPiMw}v!-XxIU_$`!=WS_+Dt9ufIa+Bk!2A7w=u+HJ30J;ZcbY=JPu97T(hvvXA~f|JTIQk7!rl49BT8Z801F3~i=-_w|+ zNac^r`_$E76j#RK;HWs?u#cok@NBs4Z}32fLE#qcWTqCm&LJmuN;?{a2V0_&#GzBu zc;o#jx+6yB#Dd(RQ04wo*?Y#Egb#%}^Qxo2(gRUBXnel+bH8TW%vn$(s)}4Xv%_^3 z8w%9a7X5_C6k*Zv#rOh5w*z4&$V|C6;;4y0naLf^#ofp_hd7?RhMwBF!hRYmRxHxL z-~!uvSAu)-PZ7LL)Vkh?IiQD%Y8GMpXC%75oVWf0#OKG!CWpM83J=kT(Uz$fVm!`q zN=80s;EL-q#65TqPin&6hk@Txi}WKW#&-kdk4wBFD;G2}R?c;W zb(ZGwg)Yfi(s26xFId~s=m&J(&n}Szo>HR>P6Mb?wpPOWiEO4_HA=W_<{w`o)Kgky zCH9-O$VUxV%yp)jRsFlhkCJ@BsxfI}*HAY^=d&wE|Ct*weKUlyZJ}ob+Vk3{yTf;* zi$1dnL$?;XADOng;W*7hH{(6s_PosJvj#>VN;xp(wJMp>Y?&x|WYKOBjfK*nhb7CY z>jH>;$h1rrrVnmbxkRGTnZFQxn;tKZa}@zW?^h~-OEy^yf(VY5m=W^4C?1iSsHHMl z#Wi4O;^YrDbWnUb~q$hUB;HAnjdgr3TOzBgz?{71VX~D*KKX5yl!YxBNus#83z% zG#k+fKDj3sA%{NRlZlvM4?rW%9B>DXo4&wvA>Nv7NxQ_0?+&GfpgG}<{>ktjl!ERX zDZWBA9)yqH0itCTF73292U)QUq1-p_B%CYzYuza1>97bZ+Z#tqbcHlaMl@Q4N(?a9 zCO@e*yva3PbXf1z3iccE70}UuV zt@s!I{w*V>y`NUwbRmun&1t4&EwYv?wz|Zk#VwDn(>>-ILf- zckD9h78`IrVB6;`)@fDn7AB5JO{5>HQL+p&3)e6in&0rc)ufK(5^iX2Hd*1E0t9p! zLcoHaw`B?s{5aMYrsTXv*yVJ4&y6#&W-=@JbvTcd=MOZOy=i>RiQHsXgV$rxDC$wL>glz1CdpW zYwSgZX(j3H5m^)#p92OC`2vKzp%|%GIyKW|IWpc^-A5ALdg~)#J_1Z*369?L6NxFKXG2@`b`_^c=*TM z+P4mvoQN$>HbiEeo=K;lje7pUWLXTtvKfFO9lRkU>NXQ77H^#sn|dh?vjL1npX>;hHyZ-j z;N&|+N^Y2F@c9FQ7Q&45&<4I39c09B18#^e4KnHNScEKwm6*0{N_MQbIaiK6h8LK? zB730z)eKZ4ZYeeXmAr^~Ab#c(^MY$}^h_PU)Z_GM30}>{yb^OHCVrME-wnW_{?2^+ zgHwhXDU*5hH3!57S`QG!$NE8?Xq_kr1|njM&$md=*7u9XS}z0CKm?9)+B;!x6bBoBk-Qfc}nr>CnYFiAT(xpS>nWq!0`X-c$KB5h}F>IbVNV z55H*|(M89@gLO(-w#`j?W;_$dIXi+Ae-+-B`=1>z$aQ|c+E2$@|0iXZ8sh(2=|8l< zkpb(nmH4L4+lwKr1k9&G ze7Qe!BD|Sg_^=>?v;+>z%k?$S`{V1H?O&|&_=OWTL}WO+i|2Rb%kdrg6cy1o4#vw! zZSgl=8qMd)jwhJ-f=7aH)mGpo6gpz}1AxFW>r-(+NUY4I&QF`xvYD*=V6A&lEKM)hae{4IMb(}dR=VQHj}o_?y$aRcs(fgn>- zi_`=@rf={MNe1^qJPs1xP#{d5NuX=uBLku9dtfCi%U*sv`8&u58Y%oQw~9XXqf(l0*ji>s(8 zOii4M_}60LtGMaU!Hu5gtVD4Rxi#E`stBf%&o-53OO5`qa35KO{=5FY|V-*IY3E zAFlo>I+JjV7C__tv2ELS$F^wx%X=3G-|MyFFh~L%Aua?1B&B zZ}w1V__JE2bddDv^ESD|_c4KM_)KiC2uWUzx(Q}1mESp1t}}E@v)m%F{kRPkrt^}s)6R; zE5Hf{KF>qG2=r5$RXNEhDW^O7ZP3iH#~^`&9RbTP1ag+-(mA@fTZ~?sIteBi-fH;h zJ^WbI!@@1ayp_i^lF2bjE~r1fWE~Fu*z#D?Dde3xV>2VOEUl_z+elX%Vs~J0qjc>< zAd{9_ooa$Y-*ue}p>qd~W_^OcN8ATaHMLYRQ8*`JlsF_4G9RJQ1++}D9Pob@w0m}? zbOgR}wFr^^!y7=7elCNE3oKCse%J8G{&1S>c~l~Q5sCt%7#Ij6ioi%%s3PTUr2CNn zx>|FYXI~g}J6J#J;-C>Hy@GxyjkI^ptI4kyq{~`(I&AlFIX1i;oV4D6EZ0pNrFUg9 zq+-_6Re7lPpde@~4}3?eE2mz)-TbanLG+%(+7J2q4%w6(Wl_L4CdX*BX@BO-zl>(ZJA@dvE zUT_Sfs#$?z={zRP3Upn0efD8TdF4nPFM;R~`rF3XwSaEJm3h_8X*!jrIZ5TzeCLg$ zN)sX*!^#N{!Q@tEU{p#ZN=#x*qtXb(pqAEzZpUO1cPX~XnV;aj*~k#P#XHUQBhILP zn3?FQ?fdb3D57+V?=fT-E3TyQZQ&c)smj*=7%*f_InF5l>Wp|+tStI9m?$tD7U|Ake9@}vGKgnp0wN8^ z0#9N6l%(U))zC+35C2BSJO#01Wv&!fi(}qm#U+!d98;s$_Yrj34q5fdBUykw9BOCd zb&Gn?xwdGAtj86*iBTGVLKOoym1}y3+a3aKe~3BgwLWdYCovF_q|Sc3$KFzJW73jwYHHFBTe9&-SKY5ZGa^+GUzWv{ zcsQ-ll5z3TNy&&ItyB|M_^}@uH6hxxVGYPXrv~Q#q*k2%Np`<7sgM8tgyL*S;Npw0 z#e5J^jvguRqPRGS_V$!@tSt*oz60f#H)?D|nMF{wl|%R8To!JXz;1Qy%iQ^ep~ zRR9BQNXb?8v%EGt5;=V}z<-B$R%a=$rF&@MOPQW9sfTh8oL@Z@iW9_zfOQp9Ap_&V z6ZdH|Zm+8RajchB9uov4YIOoIWphXT`thRr!}%9P)_8JXp^l3{miuAi!~h6lwv=hY zabXXoGd_w{rt{UMJlt=m&bWQ`BE@qFLN=7a3*P$ZhSSd0BRlh7$q45g!&!Wpq_eum z^QUcBYu?fd+nCI>4Ctr6KC9}ia8$Q(kq6w?#&Gn6A*$?0F}UQwMWbl|4!68$#fjnW zE*ov_=gBEZEeTu_XdteXRWT3@|GRh zBZr#N$?-;+Y&-sn?fek>ioPD3Q>IHJ7UnO>1@_yRO&e|M;dth0G0jL}4krzFkHvw} zHV2h5A(Yi*{7*w*5T2ZoDmge*Lr3%p7>xj&itFJi1^JP6D>=iIb*|{^1(ek<#(gj} zbO;lJad(7Q^yn`2hAmQg*|c03!3HbF5U)i8A^x7akr?-g5)kh%FZ+nBR&j5cM$)6zye67Zrc8_Y zyjlD7u6bZz{I7$B<#U*;5PM1JTwu{c0Q&+%!39cI>9FV}wrn)?sZ1GR0bh3!W0Ud9 zL!U3_u5TU?dK<4_-k=%~5YsnJ?pZc({uqxG!O9x%>}LKUXs{p@6BnH3d#g!Lo3TNRN^iviM+#DIRUyD#A*`cj()Aprw3KLHWnTtoMN568 z%zTR6f-COt+W|k3K5yDy4LK&Q@Sh$D;cudsAu!x>vpUO=paaaRcq8`U3-o92NQ(c;CfTwSz`#t;Qf z`_xxVSe~-uxNTv{)oFcja$v~z?cvmW^WMGlwC(#5Dv1QH#Rvu_&%#H@LN5vAk~j4v zH*Y$XF5Z|&Luq81w;T0EP`$C?Y&LUI9k^aXiz|HCAuN_vq(%l~^R)GCim1@uN{r3z ze99;;kTY7t(UL_`2fXfo+P6rM{q(jctmtgX(V{6Bde3gwif3fjHBpH(mZ+Ui61dV~ zn$E{F^HD3$`TiWVaSUxci z>XVhNQDz;9ro8MP^x#~jsiJe_drBc9w6RqjxL%-kfgJ!-XW4LJACxgDeoa?}=ucr^3bZU>1y>oGSgCK>}Q|`PJ3&$+;)6*vfK>n_nPl1bF|b=!so;C|Qkbovvvy_SXc`UGo>;6 zSZl*h?svRhJXl8yH}z5K>4wIx(%0R_C_(B%mM*AdyVq3dd-_~5{)B|glRoW~TXzwg zL4EPKRH{c!)&K>E2@Et8aq3dPs?|yfI`P}dfC}bTsLux*|H)SqlLLWH3 zxyQ*e9b9lb33Uf+O8ICdNO(as-`Vg^cnMK^lVRlj=#Yl2PXeOIS;#T`C)=K zw!kx&mzx40b(?3P#0%n|j85>^+Zh_|6xCaLpVp{Or!x8r1{%~6v#{-HoDSHVk`8x* znGufKRuyNWZ9}K*Bq+L9;?N(xEG3!0K1c*ppAQDXVlBC%qy>BhdH3Myo|QOpYl8(# z_X+*{KG@UKp>?XWZ){#*QXFF)bcp(>*8KDPJ}rBIH|EpU)A1{TQP6GmCwIRa?UUb% zgJxgvw2yN{?kwE-x1rVXjkfuPCS^*!`cNYO+sE7Az`T!>>-{*(fTBj&ZO(hokA*j-`w5 zHp25j=ArO8FpeH=+Se>1L(67ul`A|*8~D4uY)Fd^E=5Si*E{=VIGOGn%#1S=zgL6) zrOI|mS*t}oYKDN_QKYqA)iJr{`^`5~48?l_mlnOJGRU4(>+?ZXFuED3uJ(nJG_UxN z6WYAvkn$P#R*mQm-}!JuSo(aKW!CkB_vR>|Wyb798iQMReUe-A-CnDz4JHp{{F62Y z6`VGg>SXDstInsfO!a^6DbnVdF5`ITZZ)9^euxvZrgF*}#a}tnDzI!k;%`7@$43C= zXbxkZ+WwX7|JBQk^W0j-e!mq`Ei$c^d?j$@2uqhHP7YLz1YCm^tC}OPg zOG*KM^e@^YP77hv>LFTM+esG)%MyO;CD!ANDOL8FLkgSp;*Zg6LNc-#1uToFo7Wiw zGzqnNW1izcspXGMm^%$r|29b0i5FB9UCvLmrxr#HzU+l54R20h$jeBL69d-|4`%7I zKS;i)HNyQ&%kldt=zZOjC-SwV2qZjJ)yr+r;Y8JIRiG@O?%+`i?-OtS7 zg}kp}#$7yb%npP*%fQbJfgrvjV+o|atER75>r2ziPI8a@=&kg@ZH_p9BxBpt z7yn`{b4jp+*@s_zGE|f$&6HVz7j3L!qC{|&%D0_k(H@Ck zhyRb5(!2JLNO1l;?<_CoST~0v4+!YuJ$6>Ri@GL`gY_(&0kV)D3ScY~dLa_q8%w0% zWf79>W3#ni3BW&P&J@*uQJg6CG>e_^TS(IMv6cKSBUOs{ot#^C7)U8Ck_P9p`%*g2 z()P&q5S8>vo>gZ0QiPV+i2Kuoa)4#X7eJkn+MbTOBGDew3+2CSKbsurH_z{MCkNy| z96OS9;CJ;0>XBaH1(4=jW=%kqfMP%(;)n7XkZ)R!F)=m!5B&fHR06XA2HuXC@_%>- zDb6g1JKvreQQ-e+R`3H=u5A7f)xa)mI!hy)bGb#MhRA(ET?6G&QbyQhIJ7A!(F7Pb z-ImLoiI8m_+>;8BpnnAsO!2bhLI_GAW$fI{Z1=t9dD;B?_u?H1Bp#VLL{ge5WgSpr z#>Jn=H1uOc=T{+a7?V1y-Cg{6q;<5K3x!Z*6T}Fz9Ox$kHITV&F5vy@;q#br@L*Yp zl@r^dwIt0Vyl{5~iI%$mX}4f%w zm&#~tIiY%8Ah0r=PKz9;EHeg|Or@s1-#NsRZJa(jQI7Fbord0T9bW^h)In>S3nGV1<(8X2^u6Jq5_^J#r|^(Aj)ROyX5iea`ih9 zfsd1(xzLE5rQ_!ik$IcrHeNvsTsHg5mhUXz%_iH+><*C-Xv{8!s6(L|JHc$L{)#rI zW{z~{K01G=U5D+l+V}&FAvItAhl)0+sg*9UMT23Xxhv@J^Fc%RE?op``7lD9zbS@& zSlpTGRJEZ;*T5-`$?{(jK$@l0SWxfYx-e&_gp`4a6`?EtD3N7^g)0#|c|k=)VQL|r z?riR?s~lR^K}3Oka1ds|`5$DgGKC^fTGg43ZtBxWcY|PB2R)MhMSbV3SZUw!I}s(| zg-W|xSAlg=|3drO7pJ3INvlkAC;Y0hZ(UkC-EE$ZX70!NESDIMFcd63sGmU^p$|E{f3B;j%zsO`XthEr-xm zJmsmC%hEcP{){k7;+y>77MkbECadE7RgM6;SVK~^dy6TS$bxF^Ns zIgXvwKnKinKn#26BIeu;S+}|?O`OBynC#XsauF8qkg-h?pE88*sF-@HwX?|;d9h35 z&UpAr$1)LnF5H#{mCV4h%?0zU%sLjfVGgQ@yqLzZRKNMM|t0^+V zi`J}7s#I*o7V}`&QGC~M5m8Zaw2VsR_B6x}7ddp-O zh=x|hn$r9UEd~qyk&M4UN1lcmTSI2ubcBszj2H}crERIXREQ0ujS>tanQdC2Nm!Ju z20AfwikubOt4XApq$uh7SRJ|GwA2O8@dZz@I9JM5hlTVxMD2K;iRlOH0Ld6@&}9mO zth7AjW33wda7S<aWGf~s+UC8K?Fxf7-f&%AAQ~7ZbA&)cY65FRW~vIS zsCW5(SAe2k1(q{M?VTw}t$Bv@#GHY+JYK^Ha!Eo-K&0OS(1%odQmHBLEjm!08<$5` znap{(3GnHY;`)e(Z6Tiuqb0_!Ouv>uzh#txl~qmPItydW;*b}ajcfwQp~F&=ra4cY z3h7#Eux%3-;}~F54%Nlx&+_N@#NUW3sp(WyaNe=03)!hMr@l^K%()z74I74(Z5J$V zL1XZ;tTCbnmV`7<>bgXcl;y(nSkn!Civ{aAUnfRvICT=W7RAYU8Fw^YfJ>W%1*VGK zJg80XJrD#`59BW9sc_QSTB{Thi$Zpcg*GqY)nz>}%SbDnRSpi01mVY>+b|aM1aQ31 z4ai5wSxbt!mLxnizO{gR9uQvt$Y~Ra{bPFCUX26;Y~{=To95%S*5umbY$`XTvw1NJ z--N~qd1B(3&`Fu9PJ}J_5_Zb@QiAs4Y`DxeRf-o^JVSwkhrc!wjbdej30M{5Aj!Ey zY5Y@Dz-}a-)2Jbx>~mQ`vMfQbYWLB%qD7te04(dg;U7S&k1v*>3&a{_U6^dR7y|67qg9N->P)*e$7QCy)qJ0t^*<0 z?f3`f_C8}bgUApD#iH+xL6_ksD%|Q-f(xv_ja7r8lu!v?!zXRlFX6lE{`Y{ca3okQ zVCh43(flayTTS8Uv_aAD+!RXDS-E;cysW&x-*TFQBUAx?A^vI^2JbWjbsr4|9HfGS zCtY5KAFW=WkMnnXvM7x?{6P7ZH+ylE9d6zoR{C92dP|*-_wx+Y^%O&NPlsF1cS30I ze~8MuHF6ct2a$?%DkuR{hb?h`VxqV>f$kC5F7yb=cUGoF#r66_$|qJSZ;b-Wna@~r2veso|tWzG!X){ah zigLPc|A=-1C^l){X!k-ISG1pXc$G-c=x%2GuE_(2bjh{qlKst_6?z>9k2 zsSDhJ4>5IOt<+I>?@g@}7#|6xekDzOdP3n4WebrHTbg2S%w_N3?Y?{C#TA%6gq~2eCry*ehUeNeN(DA-#=>v zl7>ZAp=DDCb}z=N?l_^<({=u2E8yCi-7|QM4^F*j>ny+qt57A%whe!3Ds6_HbeMw) zP*dzrdp?Mkuc;kA{>QKFTVbvj_6dEa_wh*+op;)*%J4dWbiv9#GPR$hz_2^?*?-vk z!iu|@{CPyd*oZ!1clRh=5|WO8PWXJ8srV!Gm%RO?HWY2+jf5h5cA%!Pm#SLz#vqvPFrCTD8Cg~3czp|_y5e&_a53X`B{nFd6 z3MwMqwgl@h@Ct^eq@BZ7L%uOhl4D3-zbxfMQ~F9Z2c@aFCnNe$P7_#*#TP-AS7{dL z-ug7~RP+q^_;@DhBaVW{f_31bA)v6+O-tg)#8kKD8IWCX9DmQF-`>+m1G?DShBeB^LCB~_7;jEk7(V!WN!G|E5GxPU@ zD}~i-wUDcAAIw*zwUq(IMLKPx8=MxM=uR)~Cfw0^Q1$$xj141aZ^`r3tE5Bg7k-38 z2|jrC53Eij*T60vuFB$P7y56JT{~5Q+7`k2!n>I;4I1QX0c~{F#iP{Kd8yPtZ_p<( zR^~i#ZHb;QNC}A*Y?JjtaYlr}yMf8h$b2z_@C0c}RbEIV`*<#NZFyG2zi+WQozX|( z@%x>_9`JnA=;kSnGhbqEQyAZ+X^o9}wtwMeFdv%enkLyR=Sq+$9>n}q<(@=t86%yo z0qkclU5Kv*0A&c4)!wZ|+`8Qw@g8+N+WJS1<5F{!^4zNTykvdRz_~4nf084_yU?NJ ztRU>HlEsjODeSXVQU~;u4xzW&27N10M0abL@1ru}wMEeNyIJ6O{EMaglVs)BKGOp& z-Vt_@)nNd_8ZqAB4R7Dvaptuy z25UVX{ESt+Kz(i7R=?wvPwHi~|MT|@Yttkw6KZ&l5I`OgNAeT=ryRfOK1-ezm|`SI zu1m(E)GQcz5YS=2{kPw^Q^G`2rFyFFGuBk4@TI}p@SUGD`iK23uH$1~gZ@oh8lD-6thQ zE0`A_5q+#g%=8v1TV)4b7J?Rh5^5h?pk;$kC{u3uzEgdS(xKJ z1)~AmUkc_z6w5}v5%wWpdvy1pOaJpZG4uxI8+}(fFR=f2DvuEdzyoUh_54ox{uyMO zCn187K}!A@hE$zL#;jQ7Cm=hLMW>3KRNsTS)f>;cPfQyqNchk3R-<`{c!|B2F#}r!BEc!^N zUn6WpY_cGVI)z&#f@R2mp&W2ToX2eF$uywjF)L$evvpqGNQ^U? zJ)VQ00P<^E_KnqexfU!#97S7-@U)M|nzLn*wFLm_+*9h_ zjGNv}Zq2W%(cz^koV0ZKQMuG|(2AfF-EePjJ71ChRCt}-jjKG%?67wtJ)~CnDy`tE z_6u9=v|Lwihd1EQ)YR+R;%mOJ{8l~46*l^cDhJE{23PoQxZ0Z>FAN5)QBxUKddwCH z3MtFYB%G8YDHLe%c$t(^leJ@NcQZ0^uRb`iS>?J+l1tscVD>v>$ns{VlC00A+{*_R zVNY1aD$5Vky#HRXYZFgWY|7}+*jnu(i@{q_g=n$}l`(*{dPVO<#vV?$_HDVrt;*O< zTx}cFDnl^Nic}uA#ku$8(Q#^*X}78?zmKMQuWHD1vRc)_v5>5xgmGy_(92M+n%U zD7>VGT|vs)$qMyq$_apI(!GNUHFm%QF@mu7Fi4F$H>y~d(rFfMIkm7`BE(-*u~3!K z;b=Oamei6Jjnd44wE?_!s%JGd@>k@aa3?>JWSxMT0KM57{6U5;&u^a1_~V`RXv8vm2WWzNiB;cukYj{R8PuV2T6NUtp3bt zc|ijuP27e%9|`F+7^$hbWo8&dBc1j`~1Bgyjjo?Bl~}gg?0i%doNYFr{C2m-WW>LZm8Z5#*_GHi zkuMIH>30pODLEo8&MJ6$1OD9=jr6RsiG|Yqe+cJAX|6zcss|2j49ZRQnnTZ>p9++~ zYvbVDgQ}2Vo|J0^85hgi-eQ#UPtJkSDG!yj277O|{9m-&a@LNj@K?qHewen8e`vbO z!kb^lkJ$w?wF79=@=KbSxY>&&ZT|dzk`hQ^vMk(ju~Lg)E)Y7M^Px6eE~rt@Srk>5 zn-HPN$hvxm-4C^TV#h7#?adoZ@?x6t53Fi#H4J2A+O#INX4#`Tlc$#n!%lN%F;yyv^P zq_VDcV5kwSjr@XO0tnBBSmW8*DeI8MMlWR50R|?4Jj9Q?#n~rlZ`dFVIAMly%-6O5 zvtxSlp2BMR-8kL(?w-;8hk-+w-m8F!4D?T&RT%hzJYoqcjDmvvF{mG^+V0wjD;gwY zG9avI+qs|6uyN_2Y%m>+v@42JMu)54}1N(u83qJ$K@vNkSBF=q} z+Jy=gu42XH^U%?QJ1PTf{m_SJh^!!e=e#NJk^AE~TYdT(~>7eMR9qj*Ev3wy*RQ zg`!{&Fsa6U*Kv|X%Cxw+)AXnk@e@Xwkq|Y;Zpx}D+b&I>eknMm^?qzua7}H(uNcO$ zTV&E1FF3SFAF-*_l5uoIhL(Z50ZN#*{UVN+IN!s(ysMDW_|$N0d8OkagdlCP-Y(U~ zvLq-Fu5zOi(2K=f z0x=(jRU<$uJk|;)8#U#2=9hm54fvlvc0{vj#_czxAUD6?$^UyFei;B%V7I~`^SAeN z3CUg=0|P&}N>s?yc5H)~$TU{lm6RFH*V?_o|!Sjm&IT?xjPMM;G+S4u(qoVyrhiJCn`_la^ChNtjv0C;=?u8P0x5jX2K215>uUTw z?Y*|t)N88Mt+|T8-{dkb4fYQlMTnMH>?aB10lwIQ%=d=)hyYMTkl*3lHc!}8HF+kR z=MbtlL;o)dq5OXZ7sUQTPJDi!P)<5%&UYkLlK;=HufMKsvQCwHm)Aqlsde|up(N7J zA0qk?isoqPZN{B=^A-Ds54%XWl98eUTF5S0-tjLM+fyqqqf~*m_%M1Y#xyll2RSuI z>)Y9>HC@&vzR8jE;>LNdSMm@f%oR^nX$tQ$7UK3YQFUZa+Z=n0Uh`?nA^JZ}-Ccp5 zN|7>_(SCVHjqN@rte<%AKWd(q)QrZeW>Y9EP2eFFI7jGZ)sq~xCGpe&adv2?hPwr< zLweg`BTbKtw=S6;qq>~^c!~>OB()tmy|@+=%be&sas0=+n!f}DY+5=0m zhh)6N0K3BlMv58u!%kh@@L31Gj|LMQ;{UhqJ38rtfcqT{4*vha^D`HK2DDG;|BoZQ z_{}eC(*-LIPWANbq&DoAD7-B|P|zR$7!n03G-(OlFBxGJy;snHl-JT+Fvi?d@zjY zC=w;&8}=&m9`|X{O88HPFyX8*kLNL@W%*Y2MKC&0e63Zb05Xvas3mO;snlV9rW-VT zREK#gTqpIc;YhvmETfdgQvdu8mMuKBt6Q|}y*cPGN2TZPrzi#vyE55D1L1^S;^BR5b{KoM$r+*(Vaa8n z#5UF|28xN7gI`>yM>z4>BaE8=*@r3?eP$fr(Yjt6_I_Vs*cj=|z~q^-gd31PwkI6& zs1O{I!wCn{J;rYzwO1=~_8i=!^PMHyK~jIE?h8-Ep{Weat>JkXx(dl(75?k@mvcG7 z`|ktrTx~>W{07m*_r(g5K3@bNO5Z5}U;zDQl^@IsrK)<1V_RN^~JMp%aGQd9<*?sZ2Bs^KYiZ8?4pi_Y_FQt&nuKx zWQ{PLD;(PtmBcQH^XqJKCs*9{nXwg@c$g#a`I!z2IV37|sOYrYid>kmW4NM}i2xP% zB`s6)9yb(GT9jZ>3giIQ=rDVEk@Et&g>Hfv%fCaO!YZcPtbt9!AN^UGO$y^Vj;^Uv zlc*ubI$p25X>4UNjHcmAcTugR=^+c#mD^{Gl_ap`C^kI~MsC;qJ4Yzzbk)M;K6dux z1A-z*&96Vflk3!8ElEdl$Ur}+1EoF;o%j!{`@Mh8s+7IQO>8g)*CFhTA5c->L!9Sc zqxuT6^KEUTLerh2+yugr?*0$1pmb*QR=zVQ$^WweOqh<01p}F$r;LaK^jEXjL>0#F zCR-)7tDrWwE;a863^R8u?FM8iN0f$^=3{0CPilJzOeV|;onbweAh|1;ELR+y{1f~7 z68>Sc-8J9)dT@5f5D1bn1Qpz3e?k^U(PoX?E;W~N0!e1;Ol5K{j_NyC zgxu16x;m^68B<7C*1JpwEOjs^n>@qc!GzU=H)Y`7cSpa1FS{@Km3IRFZwT1Hv4^eU z5w<7SgWmYi*)q(4GK-E4rmm)pZDBU!{HQWO4FIG4tFp+bg9Ftf{i`v|JOUb?ks(9H z8P~GQsW`c?Y}^5I%iwjcq6mB&v8gb<|H>)1Ev!i_F1o20PlKck$ag=k8-B-^5CB zGDV~Z#+qrXw)>V5Bn=f$(pC(&Va%=D%4eWU6^55_ zzsKt^4;t$X**cEG=R-2S6A=X?b*?Y>?gaf}HcmU)y*?gY`<9+z>1?<^#%~X`bw#%R z+j0yJv<8L2yEsDneQF^x#cOHuY4K}wlg6=hdq&5p3TIv)$h>_Yb>9|M=0&L}wfLlq zQAsR)0^4a~ac*E=6*)#}ORI6KmsG2w$gW(l3wehds-xI$>Jes|aee{i{;kYHhBu!d zX2^*UYd;Ud-lCeb9^12WwgN(e6RTec?$g`5Q1W)J4bvmB;EH`Hto!oA zNq=UMYox0MG6Am1@EOTmB6Q(p55fyByu*dF_|3RQfUJ)=KViP`?P*PoKR@#gM=#^+ zwM=hHmCvoHE^kM5USal|Zvo@!dxFvwJFICvrtLA!WL>{byd+^4K>pBbT?>$#r>+1^! zI=WX=d>&lc=@75ZT{jtjfou=cPgljWg15+l>P^XY^l1tnRy6wZYj%e06{!5r6q5A)I&gH zI}yP=pT`|#GKE?xcleXyS*Dvu0@l*&jGT|s^yy!?7cn#*ji&L#i8Gy|V!kYaIsx7> zxrgMx-|D!$s_Z4hr4@dE2DXDM1&K|}ktEpezb!Ewq|2o#%`AGgRH}?jra7x%fbPAO z3fon!&DRs<%DJIMwtx3SjSbn;|3quDb5UY7sX-XfT4+r~v6zJY(Xzlhz+B-|@+@6| z;m9JLs@Po1nL!|b-CUP#PAPRHZ-SueoQx6(Ip2*EfYouXMPke;BM$s)ptk1+2{$$8 zGSE&jlLujoFK;(-IU8x;f*)5A4D3i#Xs-`qX0qtiwWZIJDS283ZRSXoCFciB;>h{| z3UjA<{_1R<-WsO@{s4OMeMt(hTY@)mdKrmPk9R{_VpOJ`_S5}J)}6U z>@*Ypu(wo}lfa%AL_}|o{WJ`rzQ$wZ2+k;RIh;;21LS+)ph;pW05@chp>lJ??st(9 zqkRwmB8sa`ZdDI7*oT1=2rQ9Ut;u8OWJ8r@xJBKi@0%wz8_cMfQ%NuRbE@!A1)ulh zM>o$1S1+JHE^(6v^@P<0a^!SuGo~@;mhRJ9_2b`VayhjoFFCN1RY~^a-BI%FVh%uB zRyX0by5MgY9D7FJ0r9Tnj8mWu_Cs(1u36Nl8?Zxqmz{(*^AN;trxs!kAFd z1;w)>E{)hnG+WK0w3w2ZAJXqI+M9o)GP<;#;;c^pd%6I-MS#>ajn;c_1zcI0NptlK za*Y+eAg1mt-&YVg4uFgHzubQE`e6wn^R#uBH`-4R1EW6eMMh4S8cZ694yZ&vR6UX+ zeH}ik5rxv}S5PlAi%36Ir~`)U&9!y=9mO6@Um2*-?|2jv*$xq@c1Q1gi5v!r(7RB7 zql*4ZdHW@Gud_LsMl$NflTj>#8f)xwZF=7z?x5!7}LY+CV zPzCI-Y1~*W2@LcOiVOI!EZ<0`Y{s|TU|RPuEH)>$inMb(W_u*kKG!K3r7q4?h{Uae z*EHqEOg4|++X<@uY8H<6b=swyCKZ1(0k=(i4$3~P%PCIPgkC3PmHe#-UH>9jmnxqX zZ#6ARZVYjC-A5~EvQu5{h2V9a|DY5=CrBuZIj9s7aDxo~lM3I!mp_kG-hp}G^1bED zmiGI!SbGI^CX2ByzVN4{gBQp@pV;4q0W2)XA9ZZUjY^JFmTb*acz^T#vj5msy8_u} zcP#$;55LYdE`w({`eBW=_LD(^h;4YwTSQY%VWwN?T}cPX?|T!?s;RL-{UO5bpI3Tv zrceF~+H;=56)oS{;S5Tp5;fIY5(HI^N4V&>9^CAgvIMhAF*rGty0SrH1KC z#){(AW<7FITwES)Rq+M^z z`pV$kMs}dvZC+XB{ylg>K;FGJvKk#=+Zm0b_n}XR4cYZqcyrknaYr!f1-V7j(GG7I z8qiuy(UlPHiK?*IvL#t*{R(U!9c(!#8qvqx)d@puANaJELGzF2x*^eFx%-Qu zD;0N1V210yQh4AAn|}yK&uSCDFiQ~tZ>;dbFRWI-#$fo@R|MlmSnw}iga(dZ*8x3i zD|r7b0#N^DVv$iQnc&w|nt5A@zz z6M{JLO;AtJ-e@nd+Q4vxDI4)F&>L=>a1?--`9ov`(-4^fb)GRl`dT6C&zY47Ekn96xbU zLMfiUqGKtG2nJQF6M+3@$6$z9{bjt%4K@pF2Vo|L$Sf594vcLjyv$hM8WNPCQ{ z&DfUm3LaLo@+AM@-bRQhqPJQ$D!N13fEzf^lQH53Jf9WYH33Io?eDqshS)YaIuS%U z7v_uTYD}4szmC7TZzdzdrs$VM#Y$g*(CqT=A6U0D;*dIgA{PoRq23L1w-i_`m9O)N znYZEsF%li{OpQ+II@(@@mU}+q->m3yslgXhRqbEORPNgNlhsn$H$%#pUSiqfG(ZoW z1ik9lt^Tb77#{19R-qw_u2#>OmU@k?J+P-d_Eo)0aYfc5?bX}=(Goy?DqFWk00Ge= z`_ARl=Ze1farIihTdi8qUTB)AdCtOg-tvht{XZf|AY#ncQqaMq`?%46Cc-pjl6qJr7OTcC}6*OiBG~tg3A2W+}{}um#F^ip6nNe#SCalV-dim`fIIy ze}S4+>qbK&tqCkbfq+N8pzj+gFU@dGZWz%_J_s#Ob`CSk^suzHimROC7V#&+fTEO@ zr1h|$C^`HjXB$%K-NufvYN$1r7;7MYL~M}?o`bl{%?isF#rqYp$k4bC!#ROV+Ciz6 zO1h;%EKek-m5r}So+>pIT`kO*lM=(HA4&a|iGI;B#|b=kMA_rcI16IsChSk93dLuJ zD{Pv9$lDECW0r(~1}ISfYzI8VbLZkKg)3p&A=IMw!!c4#K@$zf?`LG@Be+W@7RXH? zAutxrOI?aOYtJ8nc*|~YR58~${L{K19uUzQ8i*Fp08?EnPL32tdDrD@XyV>g!=nGm z1DJ8pZUxrxHb1^UcGLr=c7m8$C{iavX|r99Wg?Zp7c%x;bX3H3(KH7}I&$a+R2HI- z!8S$b+BU~nc{VlYlBn005hvVf@D-NO{y$v3V`H9O+BO{9ww=bdZCj0PG&*D3w%sI+ zZ8f&h*h%B0dCtzvd%rW+4>-Q;$69OGhIKpBdNGeR)|`yoGJIu?c0JYX{jEsDEJF^I zB-5^P!iKmO@iDAwM43cs_4>;cTXI+p%z|Oaa~=S6XoAjRb54l;>H8ZUOl8Bj5 zRvay&&>P%bQnO_`(oXpBc}jI>Dz1tl@O$z^U1LC2Sc+8_jG=4@IiHoZBXx)ueiOBI zc@u!YZmIYO8f3Rr+)9|83}^>Uyp>@H5nEkUW)ElNex|YO?xhz?#Z*x`S`@*!G>xM{ zK>=H!nNu6mhDDTWCOl=gXP zGi9o@Hj&lk#8*JbrcU8t5;1u&IGH}I)^|W{yvoPG0fKFTRn>}6QkUx+s3YY9 z%-JC$13G+F3MhqO;vV}4CGwLhnyZ;A9c?%YGgK){?h(qc2W!h8>imt)9`~dJ5a@tA z5W>DSlqO`_X7OS^R8*<~3e6{&VP?JDC02Hf<@AlTh+QaT`px7_0gLecasG=MB8d>X zjH&1DOj~m+%))i`hc5#dj2O-790H1+IxCt|2R{X(WDm_4D8JWu-ZiusMBN)@oYbkB zGu}+bz2~5q@J<=KGLfi<%$Gr|8r1;gw%4m2$o%!!k+Uq1s9usnL^t}$aKDJM8d)<1 zVDFjZxb({p*uI;gOOIZDZxy9WI^2I`ORo*VbTcNIm&9vRT>pBJ;%`G;} z3~n%S0#sWpVmWv|2q#r%0$V~EHS#uSS7KiT&K#Vv%H5^EVSDl-Y zh{wm~uv+Q|xws9lqnwa8CzpQf=}RL%Zm>-zf$XqwSyq2;r#UuEc2JZ z>@&mO7p3TPtWcY|5h_0+tr3DkE2clW-hGPGD$9`zcku& zta-X#{3x*jaaVz+VLBVlO>dI>;!MwZwxv=5Hk z5TuUj%)2cW4*4AT)CaEDq$86Bj)f_Fq8LXhO&O}1O2C(&SyAP_*MP}2=gfD|C8mH~U$@WH(>jElaaCzaPn%Gx<~+6;X5QvbuvA z`vfPgb@2`I0RoYo@Twc>cgO5#I)zj|RE91Nm{aMFh<}HHo&_;x4-|6{p@Q= zkQdlo!L;YXxPoDXof=zFH4+gWKwqgeQM76y@4!wqLx=Uoz8Y9<&^Dr6FPEF^vZ_uz zrm^E7pLMo^tp>=4;&Tdy53bp+1iC74{cvo)nzX*-x1`%quK|@aAzZy0_*t`2C{=7z zE-nW^y4<$gW^YQeX4Rzc7#<)46n;!oGTg+8f@w+keOd=*KICEs#yZnu;D`1sE zHA8m|V%D9Q$z?B8a`v0tM!w}p^+-&ejo*v%bhjy|9BrH|IiJMKOHx&8I}WPpJ7PTq z6VFkL;K6)6>0(8b1l*Ch{o=}(xr>J>70@?SEG*?**l7er!s%#ul?f)xpNuHIUhrZl{03DQ`GAqe zdQp)ds{VG{H-|IjIKw~5Sm9^w*xFaKy2UQ-S) zX5GC$it($5l=PCCf|V?BYJ206RR&R=y2z3-R&I#7@CW=&D>O6=2>U)n`fW{tiofQ7 z*8za1-&-+6W@G`8=s*WDIo9&WgAbfMM;-@rY@YeMeL&t1vt#ZI*a+xTErArYAj$3? zvEPmm7M=t_=;6kBPb7=fCV?y2A<1F8Dc~SsaiI-kNi}3VCFRUua?(f5A5dS>0Q9XW z$yRx&hui6U7(U*(ISvY)GN9Q+#}B0lBsl<3%Og}HlW4B~i4;FqU6L@%ZrJK4od^z7 z(zI2WGk%64iC?H{R!`lKspJhkgWY>55JuF&_r5Z#&F~g?yD-hk!P#5K6np%5JtVMb z#U~nqc9HIu5%xl(Qc&d3Uu;z(be79>k)jcD@*qACPntf?!UI)mU{gaTA9VuT3F-h1 zD9H>0ij%ubEv9_CS^VESJ$g&`c-ywK3~hel3xn6c#&#BVxfz|}vPC@nj30Enj-lAZ z`~7AZxFOq@u_2SaH~2JR$L4R<@Ox2rO)WKQhftElN~HeBM=$!-gxHzGhI2>D@nm@C zrEeP(W`_K&frq-sajySto<9uHG}{NDf-rG(_m+P_X>~zqK)?&Vdh)}S=cbV}z#gXu_cw7F|1I_22E?<&Df7D%jK|!0{LdBW^DQC5uzV%}Lp3d* zypEO{Cqge#kQD5V9v)Gc5K=$-?}M4g_~WxJfQj!ng%^{G$K@2{L7}kS)9zhe-s$My z9syll2p+0L-6kky^HQntu#P0ynNG@)s=M#MyfseKi8oG;C;svF6i-luG>~$%1wdiX@A?qw=iu>YLMavY zd-Au1KzoAI>e?tOnX(b_`{8KW;RK?!EQ-$x5ZO(G)v$uJg@M|_HUP&-=Zzo?R3u{o znqbmI{Cx1U7GRug#_*t;UQV`HyZY!2v7pE3yU(ayvy5s)DHV#}YI#F*>))P^Lz<(M zgy`qIYv9^`p5GVbh?_^$e!pHo3{Kq+#vu&Cej517hH}&}=>v1{a`8Iv!P8xd_H|%= zVl|!Dy{fkMYQMH8$UQRyfOeI~Fg3XR;*t&x{R|;J*FI3-8VX%Mfwygq;Q8&Qqh>EV zc25&|JB!2awRtGG)e>>X9%1Hgw_9fr8E25u+b3n)4p61Gc3pnKRC@e{Nx};G(BUmXvD@K)_TULxw-WN_3$6inGM5 zb<2(ZS=W&Lb{G6vc|-?jXENKIt9X2!4tRZe_yf925RO1ys0b8EiZJCt%==Y4_DdWV zedykpyBEKdA7cd4lv}U5tA#hw#E805Q&b0AB5b}?ecq4-V*`-OB4#>a$sf_41rdC# zT%u`nIAG3A)%Yp*sAVR!DETZ0Z*IrRzA=btY8I=WY-p)J3`IvoppHvG?lt73Bx*v8 zm=0_!l4l||k-sJ;v~N2p&?8Hh4`|b}^8PfVkZ0mDn(pV~M@Nu4-)k=7zNRn>_XCE)I0!;$qcT9u^UVGhWn+{2JXjLI%C*u;nwjJSplTJXv_o zT5G@PU&0V25tVv%N{{!_@@W+3_`d@RJBJe_0$h_g;j)RO~K!3bS( z9(nW1zW6HekfPWxKC6Zn@j!wT8b%@za%zGD^!DI3-S4H74Jz;#7NT2cgCl#L|Hf^5 z-6Z&E=;ZG&)C-#PHGi+>dbNYr*Fon^}VHv)qW;?DBNp1_5XB$VG31 zICFr6&Q$3NN0+q2$FIVo_aV0 zp5V7?>!`ztGJYK}EilR|Kl+#wk|=FvhjfuTKJYj(8?#q1*iw_eVp+tr@GJxksA6O5 z4!K1_6sE+ZW@NJ;2e^0Z;|OQ;L4ysU`(R%ZSm!GqtNZ(PxOCoIjOQxpF1 z=toi7JbYt-XSAR;GmCX!0Lxulv)GzNXK<5Rg3&K}8?acaSF8Pa);w#jX5odlwXHRQ zW8WQ~`&>4_AOBBSV^Ag>Eczl7p1l3K^Tpb-rUAe5BWLS&Xw8@1*zyuD%8*I>>skyS z{VFl=i(cbD0HS&t!^;6t1U1Z+#}Buy?be05%cXfxu0bmudB2<6dezKscy53 zu}3eiRJSf&mM6hD6Y;M&qA|PcLiHc_pyn9q5rxU|CS}Bfp()P#BbdoJ=m?Rnir~cv zlCjksoj|?sruOI<=NOYsaWr&JrW0z4Yp0Bp6leh&D?9n-qI=^ts zW*+Pn02M1mry4%$nZ*QrqGysLEI>=wkl}7xwA-v~9MrK*4ycq;m1bZzq)obvbac!ZPZSll%-TqhyF? z8PoLmk!O+6gRUp^;zm$KzZvI^^1g;yDICHZ0Zjf#lHodA& zaIc%SX;3yVt}eEHX1YD6+wb3IT8Tl*_LzS~i7a{eQS#5!u5x&aggC5W&p&!x9&S+@ zjrXnX-^C)dgsS^M;S5fFvh1}0Xy{aU!z6IRqKS|P%|fqlN=83iRH=_JsBmA?eylB9 zY|NQ_3#;Q<@mz8Z>tBSu&Pu8?nl9hbIT6<)AdF!9Z3|F*bFD35(JvzSnT2q0e8{b~ zIAHFUozfIuc$~5zOdPC&Rn=D=WI~cEm^~*d1SLjq9C96Ha*)u*qs$&l47zi zy0@*>twG0B63C(&;?Y4TxTsGn`_m9NC;AOY=fIL^bsimJNTBI1?}nmkwxHPSBI8t* zvmOcRkB|$D50MYv$}6 z`Y#d?(t0HZ-`ZBi0WUB+@qqoC1vI-11D)PG55xq9{s%g_QNO5Nt)TaCCQ%zIIfKgd z1NwUbO~eYj&On$Omz`$yr>s&GG$24oHs_bIgly*p($vQPp(jl*Sla@#Iz;jED9AjB zhj?bhDcU`fGx_oiq>Go7DP@gpQ(f%y7?{J7mx{g|2JY?YYg$y~!qHCQiUFRS2;Sm* zvY%O99AmLq@4P(`ei9Hqv$4^5FPpFseA#7GdKfCWA$ar;Pu2ME&j4{B{>z83@(zDf(uz}&7 zlm!RE1)Syux}>4!s!ccmg*8MF&k zU6X~8j(_F33jKu-<``@3+9eF-&8HPfhi)qysFr~#j6{zZdis{u%B;)eP-QiDv&hJf z2=btSm4CuFr9h>#ticBc4?56D%}19Yb?MorAn8U+AJher$uhz@LBNHT z%+%`0wm6o|>(Kl(d$TJ;SD9kei#6KOe-e9~MXQ+kK7A0NT8(yTtWm(7G?y@;jlODx zcPbd?y_pvij2LJm+#-c6W*xu>z~sC7Z7`<=QirC`zFtXXZ=z4@D$2a7F3gapxIM%N#VT z9ZR*Mf`Dv;$Yi>u=%PuYRg*uNfS#xLbS{u=ZM4<8A$KJ@F%=5i?O6T-@vx|7Y>w_? z3msfS;xXPz@sTs}QN;P9?I0AIKTPs?>MR)VV;zv*o+W@J3ngQ_%Zj6&SHoY`vwUp2 zRSnJljJsuXK|AcB9!B_SeKz6mikOWjBKg4x1c5PBLdMl!C|yhaDwDG67YG|(1|!-6 zX=^{}Tzxf6XD9>b@>ll^Lh-`-XnL5h;m(g=CSkx`xB;U4R)jz zKnGD*UpD~i;d2u@znG7VF%G7_%d*zs;V18m@k<{4NYu%&sJ1=4!%onFX3H=od2<#9 zQ}ii;kZ@zEadQu(JUR3U1n{`ILNsvQ)qRBg8P$vv#sVi$VoTFWr=z~V8e^mKxWB>> z@~O{g&&l-}co&oVK1My*LAs0nU$rg@@Hr`F5++#$raxC8v5@`WYoCARJEpb2`3`8z zfTn^YpfxL@EipIMC=Z{?CE~+1#V+22k^S8{>~;YRTVK~B*L?0>!tV!{yG>R6&)>ya zd7W}1q7wt#TgTh3SFY3d`u=}j-x2!|44H@SB`FKfuvXZA%nt!x{W3uN;&vLg!3htj;}XOtUFV zAto7*E%=*NKDSpz0Bt*MPb44P;rApkL2~gj_w91FtCAE)gy`|8sXW-|09b}wg_lb? z4EH)x?G#Pew5UeMf&(SLd{E6ieOa2N)VDa<)N00i+Jze&jLQ?S-hl+7^j5aBTHl#}& z$Ks^SjjQd4ZGvUA{VZQCCBPvnqpKp(6E-|BqBtUwPH~0Jo>N;i$mAKI4ck;Aw)7Oc zVz#PZ@k5ZWwvbaJ#TnYOyDip7oqj%z70x&H9H1D?(0@9(9hSOp=XH}{auKr{V^WL5 z(LK9}6kow9F^ECHdK4Nj$ZvsTPr?=!Yj7k1ZJQNFy9XOg|BL-H34k5#CA%G+oT_T0 zF+sIl^So4NO+dpF`&rz8n)*GanM8*)sa9-j{V*-7d>h*aw+paP`!#3cq70CO1TjPk z`pRFF+joPoe^5q^+;Q3?=}7K02l-4sx61NP4I}F%4lS}kK@wam zo}~r#C8EDi;YsVc5m5I8^Cv)v`CF9qBY2SGoJ3-+=@8pOjOLV?0gHDhz${s?{+L<5 z7y6{~c&|Kh?gVaXZIZ^?X6Pl5yHSCl=gb}G40M{(w4OxRS@$`T$@w?{yD;?oJw z_j1wWWvfcjRv)Q~W2>F)4FBy$xabD1a9$;SF>97!%lw#muz1zBMZF>2l`OxTAT>2eENOqG_q^NS-_g7vH+tcR# zUbr3~SPHXVfSecx@YI2~49VB&!&hI-zOau)#Gzz$o`Q5 zTBs4j#7xQB{0WvV8z7}nf8JhLj(^q8A7gGsw#dq7LbC6Ig}TtghT`PII<)MzJ1pKI7TmH8oD{K9wn^P zaCPs?UC2WqsD8@;oAnG;Fj?WOvCjw>p*i>Sooof-n-T#F{D&M48sVUWNLMcid}EfOS9MZftqm}nD0M&N=Zq}IZ0qh zX(7^C4q$iyp{hXpJD_tccr&nX3t+K*=Hnv!07%T&+!CtP0ky>@BBx*j$hPyu2My2k?ABwV)Fj{CC^9q2Q?#;_wsL zHa=b~btl!E_0@Z_uA&09GD!yBA5xs8)Ke+|9#-8Ub5X}3CLLE7yw)?fw$_qSSqUNi z8idX6vy3*gWTYLxUhBLSaK`h-9cWHpe++Lz!=s8HoQUL{@(NYoH`$NlI5db>6PYw- z50oZhITY=f4MUJRlUf@m7%ztCy5a>f=lnF#Y-SEIL6?aEl3&#?1VaN=(EZvJPLc-z zm5uH4m{ng0SCG%+7L`&j4R6K8p3n4m94Fm9GQ084hBO7WhT>enclx?p*lNW$aKULs z%~o!+$iiSnk0uQK?Yz!6Q_BP>em8-h@2f4O7EQQ>gjV}pvO158;w4iNkq)9;$}zw< zQjH{%%j-AzF(^9*l^F@JsRuqaU`lrbpyAoPO=PCfR0)rCohA&h^cd<=KwE{RPJXsj zF=S+nnu_WhH54r%d@EkC#D4VGgYr>aLqFcU5@+BaW@EU^k>Gsv`@xW+xA!edB=yJC z=Ve&T>E0z6JIVq!R!I76zTqEpl96kzccz&PB0;s60j`YRL}}eooYi-vd-x&(6P}@3 z^350T35u9K#$pb~nxE%F{m&MpFS|HuQe(t9`&cgu;)5e+DMhYbZ~ zQiCC0`v5PbOS5YwuOHzYY>+S;-yG@8XYO#5Xwt_OuW9fmx7oI&@Pi6(_wDu+K7h{&_Nikquv&Cbq~P^RTi{6gL3G)n;n?GGy>M0 zJ9SS4svI_&P1-((lv{xFd^?~xam8G;T{XArfTr}+m?-oM;Eo2(1t^NY6iBee##C9`Ra+LROP zuY#!5FLV_$fL;a`T2deO9cee}A)eb*kYULrM=?zaibJT2RNW77)@x)nnDT_wA#M{f zW9yezo6z=k!Rf1m0o@M}Etq^~dx38|bUMk0_$lX<=OA3@&r$Ee>cwUZC2(@YDm(u6 za~t_P_}56|j+3@Bu+Y!{AY^2t!-v@>0#C$WPPf3nGi$;r&;}+p$v_ED1S4!m#L0aP z3$nH)<<+?`h)S=%tKc-&Wp1c>2yK1?RdFm~ODBg=`A;g9ZY=iS66REA9zzvved;Om zX)5!6iocg%5cE01KCoC5<5gA<4s7Y+?JVT$(wy1*?z~X;&-im5nQ0<>K0u^K_f*u0+KFCqL3KQ^Nw?8P+F?+sN4Z>I#;#F3C%Hbb{TuNB3)rpYrWjA0YK|LWAdIlys6%0m4rYw+2wAm zutkEfZXd5&2JEX8PL8t|E7CS>3imNv#|eG1alTgvs%zlL1>Ya!t5bIVE~#+|RN{c!psX@&9-sEEf3lXulryMH>PK+CmtXwhL_Z-MSKpX5Wc5V? z%!+o}{uh?ce1KlN#2zUA3i%vXE4$oEz<&*P{?2vq$4W$#fqyRNKQo7q^S_r_`9Fzc z& zvFW39WpImqVxW0=lf2f67JA!ex0%D5oKFtr&v1_tIX^p`5r7#rR{!VXLIrP`TR@o-{joF?cRoSKA1)FIMU@d!AOa4x1693y=tya!9Gi;YQq1!IVoE))ZBT@8Ojm z{?J$kctJHgai+aYfsuhJ2q)F==qiND!)NuqX)T6qHEZVke8u(s=CA@0A-=T;rxFmY z59;FRMA04Vp13qp7f4Gs*$Q1dCn6SvayV(k2KR9qY?vK zH5Q8M{M9!C)zQO<#nK+ik%CZRTza=BgqtV<&}Ml{8>M1(Q~{h+AZ@G`SxlvTbxur2 z`-XfgJpe((_B**)M@UIr2q+n%`E7+4bog7TK}pIj!i)qLMb!=`L46E%8##^DKv2na zOXd1|R~eCwx2T3qGAkvjT=Xr8q^yn3vZ6Ch5td;tDQp{&gRdA& zfQl>qj#K!m-0UUxaexCIYm{ag>q6q81va}mhFqAxdFfo4W7L8fu_g{ywx$c9zD*GGmdTcdEn zs=PGHz5FH@Qv3ets#fHjFL(W z#R7letH0B2ugGxe+i2eQ2j2c;(#qGPGg%3I_1?hJ<5PhWap&59`)t*JZ~fvJ>^f_N z_2_5}Y0_0?r(O*QgE8~)*fUU!v>s>WoA~rB!Z&*7Awr)2DgofmC>OJEP-aeM@&Ffp ze#cYs`8z$}UZDyDM=EJyvU-YW956~tdea(4O|Z%L4W2zS?T21WY?aVt?9@S>I=oZB z(Pg1}qDhZqI4u5I;b6X7( z-*8eKR|=w*!FT|ghay|Y?pUNx*TedPsx@EkbtJdxI*=26Zo%7%Fv$B#wQeVFNo)^&Q#CsUfL3B7i|-b2xg|O_Gj)|uKrQwBW9Y=4(RPa)H>+g zn4MCArN<`3-_^O`-zV@t3o`~=RBa+b<(jeL=1@p=-vAogj06%qW=TN@&+ta~PCd(V z5~B|`e+h*EX)O%?zqi*PJY#@tFy;`b(v`gFo?E2i zoaVKQ!Ow``xuU&gFjMcP`i!s2ZMc_vGpRq;je`RibW_vE#7t?YY&Qs&zJQk(wI_aAuqQ%!dX8eoJoX7@T=^wi^#zLOc17DU!M!|2xCmmSAQ92 zCLZM=gYh)Qu@-kSABEs`G9VvN44al4$LYZR3dy)Kg=Tr85Nl*EUjW^W=k}W=hGX^n zE$LT4TOnywHiAmOLUsuyP5L(zUPEQ}Q114)I6W*^1OQ)-VNBU@8H8KB+$L$cqCW> zN)-4$d7DS`-^a{&cBmLHyS6|U%wA|dNE_&%$1(q*@`;KwHRF7U z6vLrj`=C3)^ecksmb0Ig;17iV;_Dc0#5s08Lp$IHGAov1&g2sb#&3o?wd z>k!8xYU^ka+heb0w12ng1gc?Bce zjtWirD>d}BIabBQ~JQLpTj_6h{hW=ut+_p<@)n^>PY(r9=JU@Lo-#N@H48hMT*tLLxCjBp;T%yj2z} zoh{+o9Dy9Y*qB35<^Bo43NOult05~ag-W0tRo0NGj|eKra%imVW0kt0G%QlEOSMlb zj{2~ftdMXIWWP;n_h`8AF3`AB_8SSc?GYIX5gs0SLuHtG_RaI9?QUwQq_`ZTa#h5xzvI@6G z?UIefIJp$_-rkQB(=}*p`!BEBwg;r!UKv1#BZ90DeV$b z;nim60v8AnF2S7E4B`;T@t@I|iQ$-m8@PQMsybgu$>U5D(7i;B^%OLT4V6gAUZmd8 z(YD7ldq5r0R$J`=%e?Fwb37&jZhC19JOQNB5!7;iE68wN=}}Z7=IjGME0NTLY{M$N ziqcSlqm?@`Ol>JnH*JjC!kkiqRFvE2&r>`s??sz1~<=PJuFPp_2MN-{lIg=;a z%(=Yi!dv(45xr0x%NtG}4<@L71<4MGc~ReYN4p5BbDF+;A#0GeW=)JQsCQo8hClX&{uTC{qBh$kYyNUZoh$Eoqm!^2zC@o79C(;&nPvWRH#U9Ju(SQ;6 zOX;kQ(tx=D=roF8n%RLS<((g}zDdKrHZQIros;1+(r(J_^Z_&buIe0ArK&O#3%^ij z#KUQMe<7d>5tZWA(YAe25%eVukjZQ75b9~kSsGo? z6{3v6-{s1gKP?ZdN$OXWfpKGCOVHHR+8JsE%NS?{K%On85FbNoCf9vcdaD!r$m_ex zTGkv+MaG7_s!`qL;$8I>3b5v9Y)Jc3Q4_R$bTh8IDxLCu;ro>7yh%T!{Fzre%OtK> z5YW@+A{dRb<;5&D%;+#Pgm_nG+dp(yXCVZRzxmB6RadH%cry`l-8P6{CG6HlYS|lY zoSa7m@T2t|LdaY%-$hg#EmeBWv}>Rj4a7gp5~pDW!lP!4k=S4H!+-JgsaL!Ww70Kb z8!VTCQ;S#MT9|`Eoh@>I`H;X(vH~MpQU~ql%W->mrd(iIi6%lLIzdjC&#PX8!T_-s zjp9MP;wF|G^W_ZEB@+sFq5{K-ZXS(*UYPpFP)hD_n=mVHv?olC zgpfg(-Y(s~v(lJYRgk6hkdAa>f+f^7AX_y1{x`U}k`RCBNWw9zAkmYg=r))j;awPi zEo4q^#~+;2*RI-Xb7z`!ubj^QlR`eG+S?=%Xg!1Afm(^+B-acIpnh4H1pG7Wusb~d z{nA@`ozS&({lUxC1iw5QPrzIH#AXu-8{Ye?IX~8uc<@ep47{`Aatn_fZmG!VZ3ru!24oj z3#w!^Y?hSc&3RS1bG{{f+v$ST8p@B~)v0H3Yr8DJ_lQ2~iaqT$y!enly*T$-Lv!|m z=zo63BYFEU>s_Ef6DQ%FXG;qU@O=zoIFlIBMpa9(E!%14F3xNOD{-;K}mviEkONd7LhMI(zl zL9OF%{p}eyX#u`BaKiFcZ?cfRXYD2UX?-ox&2T)%6MgBR`9aU(#oS)V?Qo3V_NzLK zOof-VYXZci^aPD@Xag?6`{NWeLVm993ZO$P>vZ~$61Kl9cO%sanC4=mfDFwivpM&# zJ5?d4L0iZA;L$gw%9;IC7}8_iTco{%Oq!Pg8jh&1lGT*;$+Tw0#Xjz z6?Dq%*w}M(HkWujMDMQ z5D>%9qAN3X=Id|89fHkx#k}NKMSINJ@c2$kEGeUC&fG(0`(|@)+i1T<{SLJ*{aLRl z!s<5U4JPKQHv)ddx4`MTsfIH~Hp#5i)2@F{0}fdDy(lENrl`X|V-MiT5~O~BoN;ca zhI~4;l`|W+pMf*s8Q}eqyjO=2M<@a>rY@1=3Pz&RT%;p~xsJ1*5-@Qh2PyWt5SPA* zf>oH^&Ck1((RIEmtJGgLNdP(P^ifpjKc*KQBJ2J@C1x5oDe(#Ixtho()ZqrxvN4|-DQMqi5h zdyZdKec_J&$l2dM*|K7YxEQBTjPN7EsEg%rM4VY%?aVdv%k%s=bh5J@$~25b@h42Y zJHi3%;ImF)#5G*B;P!^^D5Y3lY5zoew2K{kK1;JE6~BtMkrtpEFs)1o?_sYl1!f9S z>2y+mUceT~h}c|Vvf$pXFgOQTAIUR@6sfqYztQE%FEErlE~sSquGYyONn6TSYbtK< z?^mf`#-Jr%-Dh2!te6(zpOGI=y55Mg<)dLGg*ad=ovMhJYa5??E*)Jd7rN~jVTw{8 zW!2W|h^^%>`T-EN5?9mN7EYm+dn~3Xo<#a-R%rIKq6|9X_u~V$GXt}~o{KPMi6u;OZae4!QKEQ-fSKEMA(x7&)g^}ng1=bv&TN#|E8(Ez7HW0f(Annb z*qI<&b*Gm}40fVA+&Gzq2g@5ZO#J76bt{O#kt2zT9Elw8dWb^&#ix;{=flDh0+RnV zG#UK_4>gzw(q;^bs)?9~ZzF-TnS+2wrT_xIDQ-9!#MroV4Lr-g3PtUJp$Cei`LW-M z;m&yAqf&?)9!(wQ?6gnM7#a0~X7s~{wMQAqBuAYbKBmwy9l;n1Y-v7ph1iqx1U@wSaM$GvSt<= z>T8MYr1`aRPbQ7R5dtuAfQt%tSO z6x0+qE~#hOG{#|eHs6F>S?6-lY3ryosU!Xq!-%qqb-KJZ;$+j3czp4b?o*Tw3<1wseTE>2X! zC->kOxG{&1vV6b>+rR&c%}V@O339`}VPEzeNuYb-V;`BWDw{~fh$lleNt>6Rt3L;c z))VE!vRp~oa>{Bfr?eK9Zkek?Ua@AFrw#Y$0F}HS#ThF{Vo|qv4$MPGa5Q%yGX3q- z;}r3IMi_l}-(j*wT+y^CRP<;Y)g|BfxYziiAc6LsM}c@K1>H+;G-I5fcYwe9C-L65 z7<*7`YlUPxG3qZd?@<4B;(!Ovsh0$u7YLBA=7YN06!UrbuTiXmQ;*K&qur@b!k&%+yV;@vRpRC=}&9Y@`E&Wk@hmU&dDcJHO^ z)*98MH>p`V0JxNxJb=R)JdDdO_f^tH>ZUun>T2~>cFZz)rxejALob9Gi-5tTLFk5t zLC8FhJC0DoQM9z=s!^yu(KW2~(u0W8${wpdnVqdBh0HZ+z;lwjVZHSH;<;?|nrO_O z{gX0iIgN&Dh-b3NhCjntIx*yDgK$TCg>?2_80J{70^r0_-|#puBja*+;_EJ#7YPB; z{6d*&^7=ihc%7BpT&H?KRuXvGCn33`2Talz}WLoU+ z2AGs#YEq3(xrKajLLBx=-R<%dX}M5hdm*5&2+0BvCs6K{V&>Ifv-b4EyJ*|SnT4IG zA!)0{gX*PI)DM`l2&80q9SUpqTz&f!&e>03x`n31kz6XfpYfcuxEn zNC+7O_BCN&aH+TOj1UbT(d%!C$C0W|{Gkf%DE2>&fDM`6KR z@Dpa~WdP|czCd7@8L5NHB_{ehkZvUhJHx8-=td0IDDmDEF&@lR#-lzVVI17JC> z`X72*HySJwAVEP699VqsSg+L8*?!anafu9RnsjUNYh#AKg34ZhN3@;bq+MG*>z$7d z`Zu(_O~R3AYK0=x(<1NJ!Tlv+ACV?(wgH=TiU;eYx=_286suNc8t3?kjE}FWya$aP z44K_Wr5)~N$i8U=Yhh!3vkP>{x<@CIB-wa~A|Tn;GF37AK{19_oeTm7cG7@8G}*F7 zi_A7!%JmxNeB*&kImSR$KM$Tk)jB&QfZRJoZkl1M_OS7rk+zU`j91Qh;9}j{pWy#T z);q^X61CgHnK&IxY}+;_6Wg|JJ007$ZQHhOClgIH@yvWZ=lsrh-+S&q{cKk4+TGRl z>|M`V>t!md@E?(>2iZU08>#uTi4f#_FVGZ=%%B(>+z+7>vz(zwP#Xm{oDqCJ?|31k z=VNbosQ_`7bN}Se{XH|ZY+3iJDKPU+LjKKsx^eLE#TWkjACT{TxQx1=zM+oGSD)dZ zM{SNQ_o>!4(k7~~|80ogIPR{`ETt2|$i(6WDq76ZPPu663RNbG-G#q51@Qm)-b9wp zWqhD70376C(Ej&&DE$o`j_N-!hL`^fW7wJaKM+GJu3bQ18kQW0^ZHwg6M!}nCaZ1v z$LH?{h5w3w*FA_hWM5mBq@`O@l`o?5qH^X@9}@k+k2@nV95X)jYKU-dlgg#8V79Zo zEK65d6HhvPmI{IxvZ3qT08vEzhAjA{J8>m`pKF?eAcn&h+$7GgGDsRH%xmHyGVm0( zEbQ9B7$%mns>k*|s)Nu|U-(tA`N=$o{s&^1?|5u3eEU(Ek<@u>_zz-e0fHDhgCK^a zvg?^lJa-K9P{a4$9c(Spy07kYsng+=x3oNgc`qdIy`-jMm_@aMx%epN`5s zapB*~eEH+?`_cTYk&4I{dw}!IVuRn3GK+m!-AxbAPTJ-MXf2J$sah>XzDs)%WP_C5owL>%5Ua`^1Vwq_ua#8P#oo-=P z{keuPyEm+;rUBFp3J8EDvc?7y}$wC16OCm58fG|A$Rf{&sye#Cn4P zs-mtm?LF!Nh+soU56_)1M0&g{Ei6ZoDwKM7)b$YIm52#9-Jm<7Tw}%ZCnhz5syoo&v}UimzG@`q&>FUkZ}N9G*m`MAR^)pG zt?K1|pDX{IO_%xzFV$P+Q$Q_3csryc%BrLkrCKlmh(d#=^*e_KE2anO*f_2|(P%TR zAq}9Dw?BIb#+h2s`B@p$mRW2^^3#@0qEgMxg+sE9kTu=TP*ZQtEZj1dbj^@X1ksEg zX5AfAmM)hx56!q*&H%znN1*1ys%YU1sx(fwA0how*+8kKdq?dHAGYt4h47F(;bH2= zsrEDra40po0dbp$!ksOr`~?4SbmutggR z_eP!yTD5w(1y!1)bep231I0rz04h6RYlHdxmr5kN)Tnf29F`dmN~$9RQba^iGH%GQ z#&FB9G`Cfz)GEM+5%b)>9Z!of8tLpbI+lJ4C<2c;aLp#Crxw#3a9RJ839v1Kx-d>0 z<uuv;`YcsW53B@zfm`r84PHvmm zz#0g$?-t0p4FVfYN*wq%t|U$wA-Y^M>r`Kn<5#95h~~ zgy`J!@1f-Vbbn=BC1i;t^O?3Js>Dtz1&+BzRZfZ#A7CAXlExj1Az;l>Q5?8GXtIsX z6sH{NnIUzNrOtnIkRHnQjEvyBQ#O9NzAS7pvVm(QZe*ge0MtIkYMylnBfKDWYeaOw z*OxS%eC6v}N7U9{;*2C~&-MAsq>&8Znp7r=U_p#V#=6s{L`9Ieu8)WZLC*&~M z&hrbLDqOWgvV`2>vS|TIw7-LWX#?UrnSwue=LEiCKEF@UDNz!R(fE&la0mA|3PSoO z-4eucnC-Z0K>0@T`ii-Ln_rMq)c?q0^@&-wJ70c{iCFfGdEAuwaW2XqH4jutzbl&B zzVG-DLy13-fjn29o}SW}sO8tfzkjfESCUG<m37YZi9_W&LPnb%CHSjA;>=Q*gynmDCxkPm z_(1*-N)4>ovyQ)5DDlVj2!~0*)!QX`Nt|H-`LO$UOzzEXXPtNSUQ6!D(>n-$*)9#%*c{ILyUm&6>Xf7i|v^r zArxnRvPOKTqc8ysU+;Xtuyw%yI8e;O!!CGW_|<}igMU7dk9^<<;{JL4m1d&^RYy66 z=!`i?uWrGgxz#gc&pJGA=RAzgcpa59mS$BGDQBW*i+UA|*VIuG_y>lm)BsXBUCb0! zuAG#I+*`v-5^n;NNMj0Ea+gv!fiNP8IXix6!gH9`a_(uqbs>>Qj8~3l_-zI{)l1Yfd?VsnP2_7&4nJA{}9tI?wT=hL1y4riX zE2D0=Bz+><`_Ge(^f+q0uM2 z$8f&;U9!E&91J$!*CHGHZoL6R$bdOWKzkE&AE#2B*^nos&=DVFo98_MVN*HEhd;Iq#5 zCj8G;bpK`@O{70@Vbv!GM3w~+e?=j_zTR(axyg?JU20U=O1ToS?#-Jf?4T#N`q^@q zJ%a#$_rvH-%5%!5UVaHqn6%#?{pUUvXxG3grZ6-T(vmgb1 zM;7}_EnV5J2+#K1f{BSO$3GaA>^9MrU>4Y|t0BAfqW4)nF!k1dEQ zbnKOF+eZaE)p3~Ro%pi3vk+1^R0Kug45M!s|4XO^yVcMo8x+PT1@qsU^nT=U*g!oM zG%0j}T!$ktBgj!?$VEL7RGfP{+6zWVcPueow{(V$ttx^fP6T;#V^*O@_|GqWZ%5fZ zcLi$TYRaeM(duu-HN65vED2tlsub-XdCTYS`F*+d`+L1Gj)Xu~(`a+CMTF?9uC_w< z79Ra|&{~t`9qlwwZ8?V3EQ+Jn8kpG%Qr0sT*;U2R%OrmYYSnVBb*_(Rir_c3EPT!fWQQBovH>1azxj`*#qQ%^D zO)f0ZwfyLnRfJifk6uVv0iWcFHO9|^;ewZ``dzkmr^0bK3#fgfCc_p>4SdIb=Mw8( zEV9Nf8z(XOE{vVX2UPfb1eJf?(n2e$qdVX2W2?3&Dc9Oq(Cl3SRK4ZNv!OgVEYGrL#z;S|>D#zAH0UVuRD!jGqdt04lng3#Wz zLGJocgLA@1xu!$V8+mR}^j6a(I*iAw(idD2l;4++TwQ0O=*glybZhO?XO`K))K73k z6NJ042%=x+A?{Yp$p2-8UZMxge<~N>K*^Sq8b^vSeDW%>*Xy2(bM( zlJd&eg($sWm_LP@;UKM$V$7ZsCj5n7zMWun0>6%bGu=Rf9#vpX-W9q;90~se$9!GK zpm<6=`We_tW^6Z?oeOMAZHkNxX^L(ZW~PGFl4*dqis=p-CLgDMHv3j=K@^CAI%i8V zqTk)xJkh!GEh-3iu19Ptc>ZlDn2>)lNTEA44*nIs$QE9}I71N?twqiu@TfZd>EN;N z4(e;)2CEijbm%0C(FxT2giObEGk^chkcLyO$=d?b!=Ce{Efx?cU(pe6k$FuQBC@@y z0NeAOyCe5^!~lU)-TVa>iNwC%j%VN=!-$J}p5~Dx5{Xo&DIduX6lEk5u})P!l2eoi z_Q`(qg~;WdB*8F3<6;N+o(YvCz5w zD|R&0w~YieC34}W^T|jD?z$OTe%84oRu7R^#^hhIU8((P;AGP3B|l0p0dR#V4Q@@XW~ zMcu(If9On<(|FTPpKkA?=qa#yJG4MsXq)!gNj{@r*=ksN zAqUCL8igAjJG2RnKXeM1y=^_vQ>l7ti|~@Cd~hK{S>PytNgv*$ zR2Ie#0oGqJ;K8P9?={nCzH~GI`1OUu_V7z-$BuikL;*=yN*p<+a*Ov+LdBDvJf!gx zIam|Iyk%+ufj3Qy$?AZ}X-Kxxf0$KQ~I*rRCvWIl0Fgs>(qv$bgHjF1XQpwR`iduFo1Cq}PjfG=~1-&3Y!rpD(Ew>1}*ZSBNNaJPX<9Kp;G7s&3?^OtTGtp-o zjfUj?$S*e>@>q^Cq>6EH_mER)aAvumI?AP;9 zq^4EQ+6c7W3Sx*mud*^3%~ChwcDP$pKhs`_NomrEjd+ z%#KhVxitjA+IBby#(>CDqkXm<4{J8f3XecfV#23wjXa8U36=X*iXwPo{w?i)-bn^;DD7r*C><_6h z@ypijIfY&4pZ@qr2N4wwDJn9Z@@&&LG?I$Tah31XKXHsV3<_n2UtAk&3JSK|^dwj8 z`GgNuUK;eqR6v1@8A*+Bvq60FLc4Qdhfs1DFZ3MY;!w;w{^#(rV$;-9Cuz#SjKAuGBxA;__^cc2}AZ|mE+ z#1r<&OL6fOYB`NYom<>J_oS=RmeTYW>tSkZ*2nUSHOf7n7E0?#avEg$)fEDNbk@Ym z(|F2oPuuy)7yWoae42}uoBLC$gZh?AuH;bUK4NocT=fK)4Ko+7@FVV0vdx3AFjDJV zEbF&%ERI(M18K{0H(gz6)IQAl!eM{9KL+;nK& zuA#ChPhVT@D`js_TWyEwq7YRn=Fjg-oJm!YoZ@ENKpewau^!MluT?1ld7- z)e({VjQ2jOpM?42ed<3@gIb;fdR^5PfCPaBKtdRu(hIj0s8Y-2umUbkfp`&(AmvS~ zB4b&+X>0FN-Cvkf!WfHT7x@)gL8M5Szai8_%@cco*PYk5+)?%(616rBQ>&{5Fyp$r zMpZfC7kyq&6aqfkMeF{;CM{O$^zUS*_5gp>I^7E6^gq9SzECa0V@u8-raa8ht7;d_ zk@AHf?(22ChIhJqY!iGDz4Yxbq`k=uOOy7Y0r7?XVxKEn>a#jgvHHtCqpDqGTAGtA zO>NlfU~|kbb%bX?3@@$Jh@CyW!L(rOCG6!-$V9`my?}$~t;Qo5&y~VuN9`cuK=*U* z*zXhqkJavi>@?X*R!JbG-u5XV*1y>IyfFT<+}B}PC)a!k_YYr4tOuG_Nh zu@-@+k)mk5AH^}dddSA;SuM+%-`F1AzxC_ye>uQ*hr{PtD%Z7q;{R5H^3!kv1{?#C zC_^}X@45S0O8h+tj`O?O7ZS%;gE%sbrRHu$y0Z)R`5^khRx}`E$2W?ES}t#jiD7LN zXG4?*Kh87%lk#g0pg8!fx5tEdOp}D%wzB1z+z)jV!fQt&v58Vk6mH2PLNo|(GLX1d z$BbVUZ|$lJysai3;`Qi$?S6DDDr{i9Dy;)a*@7Q#U5h<9ss zZaIUH^CYy4XcX@fJOJW=0F_|(wGdagBnJ(j=ZH*%vzAoUQ>5#+?NTWX< z+oYzkbv%QWf#9d{G>x4}6*c5lQjcaMm@8?hZIScVAkZaTl0W$W*_m!9;Dp-(d;v?3 z(?`N=M-qa=g#7~6P9X(14h1TdH$cKncddg%OD`yahHWQQfRjN071x7`+XHmqN+3ZQ zBtuY!&k(K+2GsGv0C)*-~j*f zGZk=&|HkTI_TSxhLFqYAy4|uK&KMfhV7e9VH#W#l&cRvy8!*c<90)$!PPhW+@NXD# zn{d1TCg86HsDH>a97THh30w`RLiH4m85~qGU33k1nO&N20;9G5+8HG z5vWez0#Ny{53DsH9CV@S_s*a;Wp;opNMtZrFqkk&uGX5*mMzf2{w`h78Ndlll=&|; z)^iP;);=!%!LCLd8dyeGHAUnd35KL1ni8cuYexQnaMWaK*uI4XQ^}0CBtag7I4UrK z7Fd7O>QGZ%Q@G@=W?Q@r7IacI*?ZL)uQ4@RJ>@3NCz*-?=|Y(@?k{~al4ZRTq1Y-E*g?*gC%rfS-_s;*-End{~1WJaQd z42qQ^<_9E8346lQ#=~YJXCo^jkf27Hv38Q9C1tvr4-IogDbNRrksQG{h|@<&vqoq~ zwHl`jZgpK=+SGQX)#~Z}xw!n=S_`!9_xmYF37r&Uvpc!jJpXO~?RoF~){m0t^XIG! z*x8X@D9?>Lu!si}LE`9U5If(nr&;$K9a*9!X$GtWS!|=@P*kQOVDo11X7C}-u%z`f z?981mg}IRKbu459IW8Pc$=HCVX~9 znu9SwO+MT;4TE7e$4I>>n;vSRN*MnX8d)MXFv=;6F*i4=%k3f-*8H1l92O6ep|eq6 z`a45HO#fqUK5|)lW9kSVU|>iQrQArhQ!KH5wWAk6iC*?DCB^}B+fbt2?7Vs@`n2NC z5T{P%j+vYzF=W+x6g^7(zJSum&AB|aA_WWxh5jJH!rmBVA40~kCeKut&aZat13(K; zh!*FoF&q)C4Qk(fODftp5hGahY{0d_pe$8~+Uii4kUx)oq8q8N6#K$tFWd`r)u2ye zBWX$@K>8Mb%BU(u#eUMOfHQu&O0Z}syrvP~`Yq62t6y(TBXeWY(b-R}rMq(&HK3{y%zo4k+>!5bJT%af zJTCz!^sP^(r`{xBH?kY@+P*0RFJA|!qNjsVK@{#&!pr=rf9*84;8)|8^pvX1=%tzY z0CQIW6Mc^i&+MmU1R`sEN#dOjs!ecldME+#gp-{cV@b|3Dpiy2x;|_zPOn7ZR%VLB zE1<+zAf{Jc0=UYcvc!WOw{u%Ek?5APEFX^&L>&o{WE%61jCOsKeg+Q{W5NS(l`A?_ zr9L@zVqJ!pNeQ9RgqZTgny=sR<2m(Ui^WCX5Cwe?LE9>g-bd@RS^kAa>vT2tYD(a6ozIf%X6bZ|*@IiM= z2`9DC+#uza364AJetHEvInw}r?#qtHbe52U5@GpD1b_QUaU$C_&O5QAUvD7Cga-T8 zufyD=^HnqAH?FyRaO$vV99PD>j|;22bqpWn;p*@}OzG#5{m#MSkjr8i$NzEpJdtM~ zzj@2On1^MRBp}}=p*4Lh-jc7vE14r3C-#SJ;xYY+Y~NrZUKpq)SoQ{djPaL!IX8bY zIkS0=JAZ2*Y8YMnSMww21TY$Mlo)j{P9V}Q#?=n?UvmHlH^?vJs21FirZN0xPpMdpfmGIY^RtB!r++;1k#zdQxTt3c~?j~ImBkOR1u*=`?$NF|aRHYii71Yrq7ps(` zlk7B3l>5wtF1J z(lN129~8hhD(UjzrAZ6+6m6_h{zxJu5wA>YCm4!3P>D5`nLa9CSYZpQS$c3&^t>gt z8spR_`7L%B>n`w{tkiYe`uUE|TKGq@XU7bOOz#F!BmK_YynbI&x%uG6+Xo!ei66+iQy256-m=eGcs`=I;T}ihuFM^q zj#;AH`rt10i_mDD=l%ma2$`Pt2K5gj+~2ei;5d;l(c&!){|)M%#L$tYop%V=j|X0)h7}15o>3t} zQ!NlrxvbL%S?BM_oj#w5P1X@)6CIAOTMa)SX|oOj0-`M&v+@pOUPXNapC zhcV1If5YE4`y2f5Z_cSL5GqGYl6HSIo?rSG&s5MKPVbM2R_=vQ?FkRP;hY2eX8OyX zz?~mu2&mfWi|>*-dJX=v{XJ<2LGSRf>{tS^AyU7sL+cmJNlm0a*Pgiee+01^us;1g z>pd4-0gCxC>AOCwqjA%v<-R|}0REziFicLcF&3D{mjNCT(#6H{5=Ugb#0ed~Q9UBC zkknH^`{=`c{H+{I0+-U!A43(voTqovAY6qZPU7CBevs07y1$!NIXB$nT^wh=ADab6 zD+=x=+30V$D_X#|Zz17+5(+0Jxp-BTnke$JkG89u4X9?`HE^2I=p(IqqSJmgub5V> z>7gzj)@U|o(Ab2ni0sH~ZIG8cVmg@obmI#(x*WyfVkfyJUvILAMfls<#xVUWN>~t2 zRw%IFaqxrrmwrrn%E%_e^vlIHL%uW+UH)w|ZqMG;u6=1BuCk9?g;b@5N+lM1T0z>G ztzQlMMlW9$>XGu}jAzy!kvIBn)*i&$q?YTbwk$rB6)A>LZ6X14&z93X{I>?rA1(Z* zfX|{bvK-qQ7eZ&GK;D8m`ap%PQE_%i8S@W@HD@pn%<5G5Y8AFkD$%bhNVzHj^!5tY zmP%*QRsNAx-#=jn1JI2Lqd?3&rRdIeCfh$}fB%Cc>Yp>&TM*;_4hpHw0XdYE>GuKf zxM|)1WT2Xk2bvo8E|rwU684rdB5na9msA#JRnbOCsbq2Lpm5@MItJQg*DZM|v^7)V zN+$g@-~jO8G!RSGwRMz&aqS@#CSTR{?IPdNOJnEUbPaMeYl}0PZU2q&WBY@z+~D)= zhaA|45&X4g!%mRN*6C%?kGuIA#^>pIly$djVc=}5D{NpK)ML`70qeBO@8eLY>WfQQ zK+Bu_$7$d93B5i`IM+CioyRBYc|<^qE~^ZOJ#?AGg=QOLH+c70mYPKYr)j#KhbD1a z7nj3)$am&dHWV>*JCu+G!cgd5j4!rno@X~z->dZmRQeR_=u=Z4Q@(fW&8nHx_ape7 z(E~kZ=rt+cf6D%ntq+%dLspw;oWTiHwiX!Iovcw;Se$f*Ml|8IV3*ol&Vk=NDTCG7 z#uUS@ZJK0E+Q1Kp3kjeWZB!Az8K~>0$ug+xS}TeZFdcNocj?sZ?4VER%f9Wp3?A#x zK$!faPfq5EO>?Q^3i)gsf)S;ZnM=VOTn$X37^PV;KMgs7d?NjYlfJDznM|>$i=M3O zw33FeW9@y^Kbo1MKX>pHF-W-fh_B^d3-_#*=;^`fwsda_31LZLwugW z0AhMp!XNr(g`1|!z;QeUG3lFx9C%mc#q%?36dpZ#x>0&DWhX)gyqjx9BqKPldIdOD z#|tlxj4rKl!5pWe z#2*;!e4>yXST%&+qe(V)A4|3k#_)g($L8SQcf|a*w-N?T8r7VUEKQo~w)5w}$aQ^7Z&ofLV*+>1r{&)u!!zG~jQ`t75BV8Cd*(mTwF{yQ)4Qg8Le zXN1F-nTO8OzTgkF9Nozna2MV7MsVg4-S7;jj5QeKN9X5zoeBEFYX3UR-6P;>5)QkW zSK2(oi#T+)M4ssl%>9BO*=TE7qDoARNj26Rq4orFLQmkp<`aOo-o!^e{z@-DRAX_s zJ7{h_E(4L_M$nFRXY+g^Cw04T^=+mp6E;-kXDF)6Drs_hfHrCPu zbWgWGcHRPFfD^qoPk%DR#vOO)-g$IVtWB4+7(5l@ZQ2|9x$2Z=IZmid*q@%=Mui*G zIC8WG50P#@y?%&kYTZobZnN}$sbRDkv!FX}PQBlpdbKt4ZDS?W5du))Exh`Gp|z}< z-Kf+0PX4a%c;pbUZwCH$;HKSYJ>qL)i^S@2?<)`IZx+{VAJ{i04P9p8(S4KZ2!JrIeGS~YhQM;TjIV1FMcUTfM(r5gye*# zML;EAbSvKG?ZWH^kBfLPAq7;($o7oFr*8lOQ*xq1OlTyRL>L@JmN72}h{cg`uOO)a z0XmnEQL}Tt{ZqgFpI-Sd&fd3|m26<1JP#f6#@Zv?e^J6s3I69fraG*FN&v4!LYT6mXGIg5@pWSca^xE-3< zkzz@!;BiYk!KB1y}v<1tS%+$=SEk>H0Km2SI zk(!}&SM-)~6v(Zr##u-0sP++AI&oNpxJFF~P+gDj7?G8}#g<)eos~X9ouzUjidxFC zqC~o>BF?8-G~@-cVw6Hl&Bfr$j?0qTUm;LjCQ<&3-pvRt;4cI+70D2nr($L=E!rP9 zYZ|TqQIwRoq-1zAh{5gYEZrhSD>MwXe}ugsqUJ{Swo~EUayCd3^N};Oj&dz)6DMP_ zxm4qZZCEErX$5cLs}{#i9NpYJwT{owvc(5K$LQlV-nCKCuC|We#~S^x>tR6G!;%&i zu3dC&#@8g0OVk8_3CM@&>cte5}|B+aKZWYP>66p)>nLJurX=u{NA;Xm2--{1)4jp}Lnpxm*Q8La6~bQQmr&>vM*z`{f35Y%;W- zNhao}1JY|;A+h5|pJPy^xdAuE@oFe9B`ssq%IfjN*M*VY)D+!Oo1Z0Tdeno~w;u=X zhWG^>xj%VO#aj)C0t$7QF)c&0`sYasGth`w-s;EM$6Jg{vVwImD0%3VGh9>XT#aRu(~W+iWY#OP*M7VFTUPVWe}%-Ua<$ zV~E@c8Jw(lm^%1rI{0xa2u)@d1wHZSaFVb!)_GOXBnMVH4wqr9I*&txNis3{1^hJ7}YpN}}N zO`rtjb&_q<;&te`vgq+3USoym<6E_!J)z6E&ifXhOA;kzZynk@^HT@?0!m@|rytKN z9{E}NzDHvHIF?EA$<+TjZhUs{j9-$9`d;meEY>5j_PrkmBA)I>)P3N%saWwOv%$op z)c)ZXxSA^XJe1t&Xh#2@9sMVMX+h|wz4F3>C7qV`S-bFw%qrBGwF^V3i?lS4cc5Cg zSA2Jv+HmUa9-1PKG{OYo!l`Beu4YuKW;~m|NJVzLy#cKp=e_+Na_%nAid-Wx)h#3~ zgVNYw(%^mgu60YAl?eWQQ{D5exDLM?m32KnNLkU^ZJU`{e%+!3pKhub z;9#y*`(s10&)iL3)}W6yS?JQ!o|a0Tr6kX(8oQXFTVj{Dw_{ODGxX6X{j5=f?klE( zPP5!lbY~8ZCJpWDTh_Q~B?<^1X2iW*IjYt8Uh~74i%wr%t1-ejP`atINTArDXQ%~i zuk;Vk+Lo6;-CptShwN;;VqknDGL~i~F#oRmf#!D1;$q-@BP9Ad!oU!w&(vEF6wery z`);HDgR5pPTJn&O^6Z5>n&|F}|48_2q_&{S5$m{tBUJwb)}wm$Y?78+wZk%LJuW1vH+i&!oD+TY*@{??8%!L{h9`oGEY?0EIEa6iyQTo6klN zC0=^X13<6vQgxK0uXO8N5OO#@=uGfNn;4CIU8#cSq)=3|Lhpra*cKgwvjae{B(NOH zIwl-6Z8npx%|J#peQlWqS`DBwpe4{n9b%!e=*b?UT*T$D;ru z*W{X0_oZymW^yRgAFA9%r=x$cmZ|&eJvnCvhFRAf&TOjr+dP-NbiY4;&gc8V=#Mf7 zQVB3PeSdfl#y!0;1@BV)-n5)1)^wQcReZyN4V)zCWJ=#!+SUhdSzlL}X9zuHT)A;M z4kOiy%gk|y+>d)s%=Dl*2qnv^jn(9f?tPLSq@2H*3`8`&bj zp+n}}wc_DR*smt>x7I5`S)WRm^2&}xFL?Ccq$=_6_g^h-NpmNQ;95YjeoTGciK8N> zjZx>!rY#U2PwoavA3SxhLyduZY$qG7Yi!-#()61nS?I+#0h2_LsR@SY6WG4=Ubz0I zWZI#QM-5u@K}m1fn^wi%n66B-c5R0OKs#5$%Ohz?<6PHe1?(}_Ji zeAY|BaXG{e+0`UG5D!`Z`q$bcuV92d0V8NS?Gd}3Mbg_Q9^NimC6|~^+s6U**G6$&wu^!n_Pdv(!Be1erH)2`^mW*BsW$X?=GK<^PuOe)Rzfx5Z9` zNfR9us&@e=b1K{ATFXDefAN^52s~+fsV1yb5jLOT<)*=vE~ngdJ?Tw`y{l){(W>ex ztagFiaUBIt?~rVJokP^{WQaZne|&*j?$YL#<_V|ThjmH?@)nQhud*|9zvCti-sl3$ zb?3$SsE^nU>0<{9#eBe}>bN4iWcL}odA#V)<|lx6U#VyRgiSs!!>i1xTGQ?hcOrxx z#21l4+@XFO2!~u)L$3{K{5IqzqB_LRFs@0oERA!8rfX=)K_-`PK(^**>{y{m!?Cya z@~AzvxHmA2zYbLg`wF*K6u~E$#%Dla4kh|`l6OndJ*-b*I1Ux`H#|F} zf$<-}$boS=O*oU;Ot5fv1xdYA8hK=y$5%lT*_Vct5vHGTM)t@<<*zeg37mQ7x;&Ef zw_&xua|h3kbb-O8^N5Bnuiyq-OA^9YpMT;Ak)Yr!G%@tjgJ#FI%EMDt5nOq;2m>%> z2}2rhH)GK6QW?AkTLRIFKLbH`^!#J0&XgWdJnhV5(RHimM+@QFawBA|I1F@&7zAC+ zDwD`!nvl-#Z*)gCWz-ll`O~TM&%G=ApMop#8yilS0d(hqrG2vwMtk&?KAxn;JaZC! zX)YPvT)w3ao$Y4w=70XNbCtn@Gszy!rxI7WVlE&zY~*Z1nY>#wjcQg zFp?4$d(smklZJEcy#!WYF;ri*>R+|e`L6!n!;d`N_znE@&Ahz4t-7qb1eq7#+lgTq zFyinqxF>#qGjMWl$H7-2mjui|m{?!4jssLL>>vPEke-i8+T?rnCnMfs_O=C! z-T8>zrrh7d?bS=z0=^rQwPgbJ_Eoz(zNzZ9l@vDOSbe1@RJ{%mI>4G?C0HQvjyT&S zm@$#8A2ft{Ehw)bx(qON1XyN3C?i-xCfQW!;Ry?@7U3guaJ;rNs>Yl7Vp|JQ*Y)v+ z^skK;o()x1DXJu=V7Fd;kHMF+I&~&LB;c-~)6*WsHf00fg~4RXSP%o!!Ni2a8FQl{ zR+%x-3CBXKMXL(El_())*tTQ_m5p(Z{+cZu%aTTq2>9lxnC@;Gt!*7LNmT&9I@a2* z%2A`q)?8Q^HxLjw&aqS(d%+d^HncD~ZmAIyS2{=&W>!KnZOaTlmFTAei-?J@`6;m} z4^0*^8>j-+*m+?gjKU4Hgqh)z?fsd`j?XXDl*Z)Rh2@ z7*RWX3#|iT^OSQDz*evbO;;dAOo>~f4Oy9bcCj!6>5V}DEiD;X6UHH&(n@`nG*w1{ zhFc|qq{*b~g_#p6dL>frlu$X&TEUF2%mdFEg=CRWe2tT~exOUvMxQ1?}F+Uji8P3-1C1p}!B_*QQ3Q>omZ5wJsz&sXEH;x?;CVlCw&7lGKi;RLH zrxgF#;yVjqZ>ALyV-!EH%79ithn~d=TW+b7PXI|)Yjgw-cD5NgItf_AW`@(IPe)!v zs?Shs>tSdw>TWC6586Tcj$bqz_P{cG!0y9EzirBV_aFgEpp^V#{D{a{T8$xJsAY5a zm63~eO!=_A!nTDyM&KmiF0_&8BO+`VMD|1;*XcACtLV%6uC8(YCxF$HBvh|K zr@=-9z@xm0X(^$@&V_x0-+%=W3-;qqz(%ROOM*5L5DWmIHM+~8Rr#t{R2G&t(yDHl zQh$FvWPt)+me9fQ1L8LiP&{?1U(^eCs77s5?zbtt%2v79%U9W3Ry1@DtQIfz@ph2r z$F^C;6@$+gc~A^=G$Id&zc3AH;`M+rktm^17TGW|2G*8mmV- zDhv<_l9B-@nQp-;ieGgcC!igMwz(0jLNcpDigAG2JaKIEm3CDaD$San(pxOrn4HC& zSgq_P9lr73CnuHo&pzXnr_-JL;fY`&d?TDnY3l?7W0H-7ul(fnN+)7$&6Y?gSJy)6 z9kJDrd5cS%>MEB-7b8lU02&QppX%S&8mRFV6COw(!~>!sUp$~~Z4yFoNA#+ZsS>}<8pA++h>rN&rOqx~5%l~F`iq()* zmZTH!;91N==19z@{+e~Jz+9qAdVzPv^6JOo#3#>vLK_}7Tc$M2R>i9t2J1fp&SrMQ z%8e^0nPN2Wfw3wgm@hP1DEh+0nr=w}G4CS;D>S3g`zrdjgrG$P1M!2RQzaD{Ad_)) z*cGgr5)M1+qc^>cE6SQm>o$eKxtICG2QnwTyKH!mq=z2u7?_5t6m(QX`ketnXXdjnef~&rwBC-qUPk4L@6-=YD+r? z8`?$D;~}v^wMB?`;JAg6(&hzNi8lw!4)bGHODldXR#C#xjP9})SrnjD8F$~|aBy^J zxFo2=$T#z@;f8}DDci5iiNoj29B??(o(1HB$67fg-u>1XG$YJ(pmLc6m(A>gWrQ4y zrddm6_?vC$g3F^fBfi6n#J}ke#I0;e7Bh`NMj|u#N}{WAD@pv(u~=Wc9dUt5$|0OF z8pJBkQmtCD^O#s_95+ib4O@cmP`Wzd%!V{c8t4S^_q=rz6dw%TBrNF$E&ubui!BvYv!zj%RO~v zEnHeBjS0Y!HSy^9_=6A)|3uswt!(CGzN46ik%1{o zmwj5uo>SXl7}8F8GG@pbX4Br#e$<|VO`3{t;s*K%iJaSM?E0PpcoFJ>ThT4*X{%+5 z?+}Gp!7ueX44twgcZ(A9GnT&l?DN6}9EeW%gw>?tx$ryDmed@mJ1_$7LJIyhDI79T zZ;_&3$sWCVq*DQ_yOGf`NE&aGtfD15vzy#FNB9KsItqbzD)JK&;y}MiVP^ezqN9rL zzUoin`0tqqzo>6*f#jGLK^4dr1J2Eogj5O<&>dHD35aEF^ae(*0+tBRKP2Ux?EF%d z9%~lQd1f$U7l_TpH>L8kBm_wH}A6O2678 z&T(YIlwSIjUW7#FhcFPtce|v$AowjPGjhXM?XutjKAA(eNfV}UfL z#uOZL>ef`r1#+-1Vt9!)@*fp*(8as>FObBGXJM06%VwE9*bi=ol$hW!FX{AMaz7m{ z3pvqi#?Jhv${#mWv`uirEvI5MGiJGU^BqMoe1MhLQPwihqdLk^wipp9mCwKcR*SgJ zrXGoxsL#Bc4^Q+eFtaFPO$*yN_FPK4Kvbw1X(qJO0IltYtGp+x*0`xutPy)rOeGRh zwJrAeH`T=-^_)!cw0xC@ACjt+Pf*k$OJSm1@K~NFT2s}~rw|w{!5L8@)K2e41SY1Y z#FMi`0-Q#&XI63G)*?1&o2|*I;g?IjZ%{dvEpn2Z$V-{Gc}+4RTaT=C=0X|kLd!##8dMiI*9Z$V zEvsEIL8{X#KzVe9q+06bNNr8gLpaoTQ|xq0YWd7R2*ZhUfg?Vv_zy% zGoIWP=KNQ-=v4E@d^kRn*qm=*@JSfLd&@f^Ii1#Elsw?C+qr z8Rowo`TzxvvOA#%s32bA=p$aB01K9_oyxXOWqYTxqeIyT2}m`*?20S9v78uJPQtP$ zuI$BH9l9Z$Bwk>UzdqllH#^i1XLc-bWP{m;S$jVL6uj`$kf$gJ0$N~dBF;Q zs4{>VW_hgn6q!$LC%k+t0ZSPCZfn5Os*y0HseVBj#iA*6{RM-}z5p(qLEVJ($V5Fv(o zzaR1u;^2qdVKhPt41t@)EitH4wTq;G^=`!$w;``P(3)ZFbtepfyRgp=Y<)MJ8U$DRkU)g$l#JcTWufqhtd9G*ky1$YTwMA-^ZJ%$Gi zL-~mG0MvW{HFHmNunwcb7?>1Jm6*Tc-*M{)UUB%x5!NjdrjP@rZqcJJyl%*+K(P<@{AV>Gqm6Yw!y_L{xUGXRTIF75V zRY3>&M|Mnx0;JX#XWJ-g&)ztHAxdDnj1vW>TowpO8)FDU3+79&@IWS%VlO6T^`o@n zr7jDh;3Nz@ghO|N)QAcLi3XVjX&^kB*ySXcX^e&b6TJ^H2it{r0$1VLC%Hz zsoTjSIjNMKfQrCCoB`Ft0@_}fHBVRCV0O@=YjTw2&4L*KgMF1Q6xNghc1?PxgpGCUDk*$IQ&*9YpCG#P; zQ0iC_uB9tDpiQS{`uHxmGSdrJrCzXX(=NC!Gj$i-5DO};kU+eUi}7>|Iza}RX@mn9 zLW95N?8v=th^o7w~7qSxGfcsI3Uupc@I9u7_?A2}1~f-3;5%oEq67-H{@f z+u#-%hCE~|Y{%fm(e<)qkW!=*Zij)`Q^!8tuyuEA*8@_B4`u3!(j=oCsjwcGoJ&Yw zxQq0Md&nSYBYt?8WWzHg2c9QG;S(|f{!T{0cO(yfM7e(^V~9cuh=q(Lb~2uL$pqpf z6G>lEMDj^7nM9_4;oq5L9x2C_em1Emb8uJCgRDc$d1OA>LKcv1WFfhmoJMw%)8%?| zD{9VIzG!6m+5>mC!H(lCUw32FjEf6oG0wFmWVm?S5sBU|3EyiHo{!2D{rmd&!e8dK z!Ol!~j(hNKcxX55NqQLn?1ue&;E6VPsx!yFQI37#pjaM%<2arHeMnOrN1J$!#^iVu zIf}HX%KtPZ?1kIsB|Xyy&pqPb4KMGrl&~@W%#_RnDdQZQ#p1kjOr-=-eWFw5>zn%Ejsa4hqkqJPP&2ntbUgD3DYf z;G$M)E^OU@(VxU}M&-~Zp&tS{6Mbm|2Cj{uld~~!oeOP92%5L~5rtvhRDynfi zd<>t+2xf;*qXHVbzYT1}ApL>Ll2W1iO=94-)i|V9$;O z$=s+al9T@K!`1bR&EPSZ80ceR# zOLT)o)+YUGBKt&?6G$-_=qTDgTu|2qyN97L>E9ihXkp0qXZez4Dbm%aP|^lRgQ>pM zgW&X~`YgK$^`+v9+*$dk_9J&?`ZX-$!ejU8z677Mome!`leR#2U$>{h;_H485;A>% z-F)5KiGzW!$3bvq`g-_$zMk#G&4CLCyb(^--CF?HxG*TXD!g|yCPIe!yuy5F{2a;K zr|`^(9d&oa|JsR{VbJekdc^C}BX;;K2cb8vl!W47ECh#<>9e$x6bfQE;iDhxuFcTs z*IkB}xTM=H$}|ws>En{-#$TC980Z9lS&UR@9V;}$tOyzI+fLFHXmwenP&b=%*Nrnw zIOS7+n9IdDm&H6b;9e|{f}R}<0FgeC#y8wkWA@Hy?nZ!5;Z}83d&3R zw-dh#!QQ^!2jL^5Ufw@DLjleQHGN8HBOJL)&ynBQba{3Z>Vza~Yv zOZZJ%2fy+47LJn>ah#8Qz1zu90&)h7?r2fh!-g(WPGs1qRau}n3-n=uzGz++aA08m zgOQ0fX5@&<0_m+*)kB7vCUEJ0iCf@J5r)I?l81~i(Kf`m!muyu0q!UzH2>{gnE%SC zrA1#f^F|LD8Hec|hWf5NWM0%8L@PAO6c5RZ!}JM5z(exmFnz0O-T^CEpuaEuX^`dVTOvzd|1gX} zjuN>Ia=B=90P}6>m?+Z`Q8QEb<`|OR3|864aP#-|{+lsEX6PxqNE!ZE^_1#eWKK9? zrQUlpplt1!T|zL!ulM$UDa4o2Mk-GAWgG;XFQZ+&tlFjjyF@%2YsRxQ5zh?&cNzZQ z&(ul>|F1Uu-xcrwdLJ~bU+*J3wUH%yUs>+!QwGw&84a+-T0m z40GYg3iL-vlm0tEtm=-yK;5Aas0a)aW3D5h4^S%hllq|FuMgmV6+ZuN(s(Mi7_^OhS@AjYn{)D6{tB3p7v87R3Hqg5rmN~Ko$#Rvp^1i3k+s~AuKSI1#($n7zqw1 z!4W(VkSk-npk!Ap+w+jK%&4;x6BBZtk^E%FWJ{B($N7`Cl`J;r&q$wNADR0!U@RFa z2Q%*>at`0Pi=3m6j3fgU$7$8-vdKAhpNF(|%(}9|gnG#NCUTz0mA>y%7I^oBvdD^v zIJ?M2tu8KqxjyM3mzWHCrD_|tz!e7Bc!Pvtorhc&$sA>?rGIS20)a5hVklQy7KYa; zS$bOTL*xpx+b~h|cgi32fo@B+kn`$4hV#}mjK*zUbWkS%3@VGN~4$vp2fg1-!sfizz)-HVIB zZnD)lQR;_(#^bX9pH=2_i-|wa_?580Uv0v_#_*jV(e8M4@Rz8hx0HpCu85Xy!_uN? zDU7A^XlVzQCJDh&YWD&WM8qogT?A9I4SFCZQp~?O+Q1-y6={eNwfB{UkNoGj4S9vB zAJO!G)i5x9RA49#4ABRQj0z*Ka&aW`qNn8sNBKq_gaJ5lN41j&sLb_!zEKa6i?*Us z`bkJs?Z#|>_(Af%K16pRTYU)KMqbqen{mDJY=&;WepDZdQVjErXeSS=7z=u0lbc0| z&n2Tn;{Cc)<^Y2{AJKJl zG+vP73?1UvhnNdS4o=lU7+ydgTOfQIE*Ykui za9vLm36-(<8H*lS(@vfjJ=8FrEht8+O(}So7R0UA(ZxD2GP+O)qe%do2Uq@od_9O+ zfJlc%8yW6s48f_s(FnyB``j{_3=o-j=|MeTE(*TU?c`-#V##wS;AtcW`)t86x>s;2 zFgT4tPJZ7QkxPpnGkgV6rbhlC*jgmpH*nTVmScPc?c{ZiOy&6Fv}US+hH(QBt7#{1 znb-_dU))gRTZUnX6LlO%#oPvezC&dv_!etTb7jR>VG8r6aU5pUV)LLj^>`cA4X0##A9$&yNm8a%?A` z8iRpCR8!noxbTi)rpsV;U+GU~FHx&TRQI{zJ-@Y}mIq-VHbbx@J_Hkgu4itBqa>K8 zXKjX=emx7vr!K+RlBLLO0u7ue;>-wN9)=Y?O`cB7Fbm?WLLOzsAw&t2nDEgT{CcL5 znPe(vVsgEim;@uKM<72+A~2c+$N2IN0=jI0Uf|0^M;hwO(+hI+;5O(ZAYPH9kKP8l zUlf!I^Tce7*c=tG@X;548qOn!mhJe^!<(BoFJo&1V@d#S%h=&AkSEAkuGrmH>SKL%y37ce3&^U}4; zVJZ1HXwY9<3Fngkkl!K0qCpRGgd9aEDuLzBhy>RDq=Jf93NmqLe>x?UBGd+@lp&O5 zdm0KTM=0C&8jf;*6Sm8-*TX`Civ1jzLKTEY+JA#d2F~GxTm$ELCL*)rDkw2~l#n|O znG;;(45}h-RKhee!l-qn1Cw`7d9Kl5r5Zv(S2^@Bp|2rev~v%KGI>Lg@5&@+m_3@w zK%-sa&or4@1e8RnTV8YLCne&@thg|ZPHHAwsU3R2n51=oJVC_^5Mw>_ zpq)BVzHy#L*hXCl6?!(nHArU*jCb#3i=?jdoHr?JXd>!ml(!fr7*ctkh5$`MsK6VB z^QpLO4SMf~^;Ennk?-9HXULni(cVX(o_dkq7;g}Mr8>%z=e-7QHmK-hBbKqe;<$o# zLtKXC9mn~9v^zrmEuT8p(;f&7uzcxgp+1BLTE2JG)1C+oO8lBN8M?Pp$LXjA8~E)` z+bk+xzR0vE+GfyHgtF{jTM6xjP`16ht(f+fR_$q`8d4s2 z?Vy9CkALIZK>Y~yR=#tsqnQZxQGRr-rdbH})v}!9OfO#Kw9#yu1N~HsYpF38l#g9k z7;`~fnnW&L5Hc@a^fh!a9U?AU5cjFPJyP{1d1u7IsV{?fU^*zc?{Uf7N;jnH3+YgC zmkHy4^gNo2kOQi9oeo3D1sQrd9WL)Thw4-0RhpfQ@J zX?J}Q9ZAGxdzs#!j>2{cP^tHzc_3_at@l$*jWmoS+r5WqK0-;b)B7wPjgW_o@)puD z*rOZC_ZH9sgu0UgZ$2H1P!Ce*9Yx0>$av2jL6JyKpV} z8*C@r;4{9ER7(-{BDX3_io(uMz(P`2zk;zJw#>E5gWs z*ThM_A&KOlq#K6W{`i}P_+0X%nAv0$`HAFXY%3tYkV5h+nMnRkN-#FfAitAxj7%7H z$P!A)YRbqtl#@%TLaw7Kxs__7THsmiDB7=h8m(LTqt4O{Z7W{`6MzJH3kzq6g?u`XbGx zhiHKQ4SRl03+T6WEImTUF-8lSosMTtI)QoUL^cY4(K2izEoH@Y2AfG|vN`k=b~>HK zLUayWN>62tbS`V5^VnKCpS?mW+3N`ZmDaG2=wkLMUBdoBYuR^nDf^u+<5pUK&mFXZ zyXXp@M9<(lZR9;@Gf$^2ygyyZGwCWmg0AJ`=sI3X*YmmbOumF};EnVwzMgL6=hL(K zmGm5bBR!YjPFwk3=y|-IUcg_coA}%Ga{d9mf`3A<=06~3zy3`WNMTx>MOoA5db%3k`g@;KeAJV*B_Z_)kA$Mk@5m_DL>P9Igiq>m}z(8rbU=o8A1^hxDs z`jqk;J*fOnpH(gNIn_>|SKaglwI_X1?MGiy2hdm5T>6?ilD@7M&^Oh8V)~XklO9s% z)3?>d^snj}^c{5_eOEn?{!P7aX-W^$7i5Q|J$xmHwo;>GN7Q`kR(a|E=|*ziV0ah&GrW)q)JP$&6@I z5uV9ZZ4q;5i&+n?f%&w5m8_?B4olW9WhvU_ELFRP_0sNOY1;j)kM#K4UeOFWF+t_pH|PD_d@*tlpZy8mwNn!kWy^ zu=Zz-){U&idM;aOJ)f<%-oVyaZ)9t&TiJT+PIjjCLAJrVn{Bi{!Opfm&(5*F%37^& zu=A~l*hSWl*(KJ0@7bj`3%kr_XPazpcDXH$U13W{co4hRHk@5=o5*gkm9ovYQ`i>U z9Co8^3A@R*4B<1_c3U&M)wYV=Wn0U3*v@44*fz3zZRfI`w)5G8wu{&<+m&p$?Hbl* z+syXZ!mQoa#vZmk&Gy<}WBY7}*nZpR>=8R@E8kcE~=Sy=^aHf3=^= z-mx!a@7k-_-|Y45J$nm#-@cZ8U_Xa_Xup_!WWSMpV!xApYTwBY+aF_}*`LJv=hzqa zH`$l=57<|K_Al7i_J6W(?7y*pItcsLp|bBBPWHW{8~edAfc?uclKtceB7PkE)iI6z z<~W7@+cB5@$5F$bjx)H+v5LDL8+fAQBA(>9ocDBW=E;sbd5Ys1-q-OWPj|e*`#Ii5 z{QG>6;~RF!@gvW6{K|(U03Vv5@!SLlAC}$^Br>l+a$F4fja?rh6=Z%RLK!=kmX~ ztN45F8vee!o`2vz8-Fk0pSiE#pSw5nFWfirFWoouuiUruZ{0ijcZnAMLt-NTG11F^ z|CQLC|D4#1|B~2;|C$)!|4Gc_zb8&pAhA>-iKi$mafzZNE>qORdc~4>p<+wCM6oAs zQW6qxRGf*oDz3zbmBhqH6;I-;ik|p}(mnBz(lha6B_;7|B{lJ9rB@PFdM7DLT2i9Y zCn-hgo0P4jCk;V3pkyRXQ3fSVQ?inO<|sKymCE3xWy+AGdSz%*vyz*%P8pVTzA`-N zN@YaSZAu_1jOBZkQAzui{G>;fF-dPI1xbgLu}SYJg-Ks1lQYt)qltrGsO10-DCFFTksqws_Eb)A;)Ox;EmU@0rmU~@FgEvWO z^y*5Jx3|*l?WeSOvz67}k;)oxP+998tE}@DE9<>8lrz1vl?~qc%30pU%0};MMBdRxb2^hLwxF_bV5B_bHcnA5kv#KB-*heOcM$J*-^m{ZYBf z`!kk*SFY3j%1wHu9^)sO;2N zEBE7WGDK?3H-|pJywW0Gl@zb{B)1atC{w)OqpP~I9Y)EwJ_A}Sp}Mwz71I65N<|j; zab5K%i>0r(QTUW%Tq!^bmBp+`h6{A}f9L{H=&Vy(Yhy2FJ z#a5lmd(Y(9o4^GI@#wIoM~5{%I;`n*vN^2jbPDcuIhH0F?DEULu?z`yqKr=dg| zRa#VBCFYB>P<+PWlVM&r48bRaPoHE<#XbIH6>UqNa|M ztWAz=Q_-o-Rc*8?*2X6INso=<=uc6cbZA*u!?BKs={wQ7J+v;?<%!6YjuLB-SMa05 z^v>8s(G}cKV$13*hArD^69wrfog70I?9(QK)SHcbW+#M?) z>k)o+%)0w^WuGM|URu#L5w6mFs;+f1Qh6(3@^gg`P;#GYj{IntJd2&Vc*Vu+JV3tG z+@W*iy@V)@w*?JLjK+CL!y2^431IC^PQf^Ps9{RX$q&Cm^0 zmPsC^Ep#PVSOZy4SJBmAW%rP=bPWb$8~X>LbglS*;)rL!LAs8v2M4c&i^Z3>H-M8)r(5NhEQ$!Lk>Jk1js$nanZX?)aR9?)tqkt;JMtgn+ZPes$#z%*pjtsu zZ7@W2z;M+GV^udyRg<7p)yXKeCz+}ylj&*-nW^?7^=cY9L+wMF)pT;5+MjGz2auc8 zLF8e7HIwXDv&f@r4tZZ4LOxQ5l26rP2E`IkC^{DNClr#gxzs(I9_=F<#yG##jp zp_%GfIzgR4C#gkrx;lx@R43Ef>J++IosL`48T1?6&i=2B-eT`gz5)!D4C zI)`Pbb6KW3kBw00vzh7wR)+9A^)yzcp3Z82)IYIWwURZci`W{qie08wvnvq3POV|v z)Wz&pbqTveUCQoJm$BVy9eYk)&R#_Lb+v)Lr>1wVC~(ws2Kl$*pQL zcd4tnPhG=P)U~{~x}ImKXY#@720mUrix(k0O+A~>R?p#c)pPj*^*mmwp3j%57x1%x z)eCtm!WXL-^J~;g`1R_ge2cn?Z&NSlJJc)qqw1CX351_juja3-*YLO0Yx!T*>-m@J zpV5!@l6~ffS_{$U;;W_YBFd$fD4=@#jFt zX37Kf?6NS-M?l=U!zlu|4S^{F*nz-*SOJ6)2#Ch52xJS4c$J`EW{N-6{HTV}FnF=- zPc^TY8U-#jHUp*@5=WDe?eshhzC_~2nBQ4#m%hs+F7ge|c6kh|VDfOaJU%zRvzjly zmQ%yvQtyOuIO<92-B7IF3p3RFV3xWQ=BoF@0`)f1Qt|G@7ipBGU(;?uhcOnliU zJ`Na^sawSBBU$nt4qcS|sXF(6DZ1*@c9W}jwpuU>y|owKpO@7}FBElz5>XKqOMLFe zAX`p!kxNgA3OGTY^$Gzei2uusRQ?3{B?*&IP=4elpb~lND|%dHrpFWHkYwOMBVe8S zJJ{4C&_g{6euRf;6bQW-{LwGWjITU25lWMDVjf|9aiK+p(&S|kiG5*zrg@OiB~e0S zO+xlq_Sl(N{Ko`iIuYxQe+Na0Ei?_=QxKb;Wsq}QR%a!fw~iZQv<>t2jMDCDehj97 zF3-o~K2*>$LD901$4auwE^GiQVjWSC$nQ73CZlaeX6CEt{3Tk}qWKJTj3^c7A zbZs`aoQz&-u)YBq3t!EZ3%2+?FgG9&z*}94wU|qXv zcKGNGCX;|Af_3+Q-r!bO>lXLe4I4#^mC+Uvz#47p+TeB=O|i>H-5TjLelHA}myJtv z8;uJ=H8|8ha38!QciHFQ=JFaDjP8ZL^jdj&go=nN``xIr-=)`?Yr?xy?F^On7QJ4E zB|E$#{ZL%gy-06}t_kDCdoDO_tKkXd08911uIt=1S*tM@%O|*w`4x-Jq{V+y*1g2|`!F=rrSgJh*&Dt~A`>>!7%KrmUO9KQ7 z0000800)LhH$+Vsdp`jH0G9&*04V?f0BU7)Vsc@ZY@rGzf5}e6Fch5EeSt3QoDm|u zG-v1mAw;D}g&r#P04KLt#ZhpOBmo;ap8Q;mlb_D&{pUZ#dUnS-XVuwYdMOT}c^g zrbQ?Tmn+onJA;g5Q|4D}JwhYV)P_4THVLOrCjGl;$&4rE&(SV6Jen8F)vR1!@Zgc~ z;%s<*gWsdl%M8P|N^?kV_?GLZ&=^pg8dx@3IG5A z2mnrsNH^OTY}BkC007iMmms$a9hYE(3I&(=q6!UvTM2wr)w%!9Irq*?CO2e~5X_LU zZ()+K1PKt?LKc{q1(Fa5s4z)}WFVP|nF*VS3!rV)R;BtLY89y!YxPMhnW!k*YOz|k z?u*tHtF+qM#kRJu^1kn!J9j1_kUW0xrA_WR-`W1({+)aA#m}EO4gfRwE(Q}f`yYJgB6biACY@__ zV;~%egmAfz%M8jcZv zAK3M(r>JkJ!@u5|2AWb;TY^umsSa~9Pf`u)V1wFITisAGA6b=>t3gSX zRKM)yS` z-T0h%*0neuXzq#laZy?zhzO**{b7?MBaw#eYzlOTBNYKZspYH|BgZW)Nw_$+Bw4PH zF*fCF8>k7^4o=!3wkWwJ)Y*l9fUAAm5fEF)AjPCqbfZ>~mJ$eV^>qYVV|`m7TpsM{ zWRQtk4h8E;RxMtOFPyM25DY{Xqoi}a(;Ly=a;G;M&DR&8UDeGbF5!wv&Vp^Td#wR0RBNvR zUe&tJfHr8S))x#2sMeQ|7c%Oh+&XSBn>u`LI6XIaIAOr6b)H;j-6gQv%ZNN9x zyax?frRF_kK%Hv+7Y3L3-ekQFIMOeI_L=l8elcGoj!A&n`CI!TUAg^l|XAT8pND?!LYy%4u7qJ{|X8KwMId| z0W-<41%S5j8vKZK{9^-})LuVDtRWTYwN`()B?dVj#2G9ZWczi)2>)gwhx&4$wCmeL z-RKolF{TYmy1#~h*Gal>AbZ11Gylxl}hB3tqJa0SUEqKR(b+Ddf`W|I+ z|MrLh?-SuI_^kn#sG$$3VnMOUI)FEC#Xmlb$Rm`@W62Lw(OJ2OXGl8xQn-w^{Ud|% zL(R9tp9m1n|1dd3sW(K9po*0w znaNe#DM6SyxhwZPqvjyN=A0El+&s^gFcJy}JL3dxIJWhF2cL|KX-+1XPHDy0(KDbV zG$+OaVyq_VK3@?ImUzxx6vc&jwmV&7@nmOse+mD8N^uYl)~!>5OmQ-U;bq9_-`?Wy zqOgJ1?vR3iD-Tj77YUJTmvndgc2Mm#ef=^6e9(->%SNK#w)rFVft`L?k9iF?id{gO z$s(s}PQun`16sjPvvcSqIp9yi);P5G`dG>CU=!%tX_es)HVIQ^hdn12Eyuxf(Phi~SL6=n5$IoZwJr01cXj()d=Wnq3-D%l`ZOKABN%D- zV~y!xv*=!$P(eFbA%-rN#lT&M^>v`r->8C9JhbARxmYrq!`|T5K_<*YIihrAjc%|7 zC>Z!ND`t>CEKRRp=Jk4&L>JP+MHKdL7B7DO#Br1iW)3gyS|ZZ{TSj@x7x5Xa3}%q1 z@PcW7;G6`_P0ytrhm~a5a<+nY#ha19O(;7JV;PzgyO>px_Nz(L)g;4e2DQUyci5+_ zB8k))uvrFCMptfRPZ@M07NTs8d4KGR5a;Iv5c5@v)U1iEqvh)jmd-M;CSaGM4A2be z`i&V$3rkaX1e;|Lr2FHhW;CW?vobm&bRuDYgfEs~%o~~rksJ*wOVKtWbf;i2d$3Ay zi2HL|d<7bSzm1~DW<-Q{+D3|m2J0XX+`@2wCmv@`!c2IM3PbK~un_AamM`yD){^Y) zEbL?v+A)98a>^k;E zbsvyZNe&f5$>9ceBgx^WesZV^VIj}HLN{e>#m}iU*e&c+J?tPIcCT8f za=-u!94fV$JAIwqM>~Dv>^EjAzwPX>nH*5z2Ky!%?}utycNqg1=Z-K3+#-{$LoDCutN z>GTI9<*_tpXHf>D1|GbuXVWG!>BpSxap=M*BI}Fs4t9(pN>`Vka$^4AVjFZTAi~x`y*5-pJ$Om@%QKK7f#s8 zeu#H`L9RLYcwdR4MZ<1`~46nsL_WPX4mbIJ$W9Ty-zn>sc}As+)#rOh9wMcG*d#>6Xv?LN z1Nry^`y=u3i5WQ64dlG9=x8V(v5#rPzoIYWhALMorW((4*R$WWO|C>BvWecW$yWhM z)~V-zlUqlO{Ehvc82N9sRC=+tlYLG#afLKp4oKjPUS-N;Y;Zw!>rSrGoJuvvMsw`S z9#y88dX7wyXc#<+JJB$Icrxu)rglrA-LQDKn>oqgF7^@~nT9l9Yb!al!84>6aIDrx zB5ie$-lGP59aze=sy8L01`&y@JwHppkA?;}Qh1*L* zt$5B@Dsdm>y<9+gk+|E6qzN0{ETa;)T&d{nX0 zTSx|;K_ZWL5E7X!_wYO?pU(4@*_xjfw1BiT$|2SM?zR}qI{70OxEZoS@9Yc(>*Nbd?WdtkFK)I$}2>dQ^3!7u0CWWHeo3h1`VIl2dxIx?f_Yu>DH-LfuO&pr?c7LEh#VoFZ&wa_H9rBZg4;nFut9>c4Jg_LvljjfGkK! z=#RjDYQOne;2JPLEuo)|{fvbENbF}O^haU;f`op57XHtj&>xNc?1X*}_Qxdj$6|k6 zLVrB=CnWSIVt-OXe=_!`B=o0Ze_BF67yHu_`X21(CG_*LkBY!{7R(%gbJhS{vj^ZR z9Dr-i0KP69Ah)>#9$etZLcosysKmLQ#emddA# zJ_E{sekqj6XSqqQfaUVJ!hCw=6DWttJu$1vXSJNq>06Q_*zmLZ=_=5rmam(NSg=cRC&d~PtuH=4M8&@7)V=Cc+2^0`Sq)9KrzdgQ8gzPp`rvYp)(c_JG3aUPgRQ-=-GddzQ?Roa zc6mm^m7b%p>-hCszT68} zd?)@Lr4EN1;U)>W6TU2!c?JDr8+2&k<3Qu%A&F0bk$fVI<&&U*Plow?3Y7AxP{XHx z!KFMGI{0+S)>lln*5SVLpLck2`rwv4PZa*clh+Fe;wO(+p4!|28%Idf{=m?F1}z+m7E2MILbi}>l2ao*|>Q!9p-bCMk7jN4P@}Okj0x|3||M+_$5$(%rAv< zei^Lf8(DEx=Cwt)ow4+`)c^J|q zx-&|awaw$N5dWK6bxhY^6Iag@RDF{TKNwz=>TMjcJ!o=Wk5hF=Q~z86OE zeK46{2f6%un9aX{s{Il=+zsI6H{o6%!yimuDseyJe?%Sv`lJ{BN^bVaKnEXTp&0?6 zVsujuK7#bgZ^83!MNRF;eg6i3H~0N3ju9Wbaof+HhY|6p^qHsWDEv#?*bD!nu{`BZ z4yi~I9})9o#QX$eL5x^`poA@nnHseS`~&EN2f&r7xg5Liz*#8Qe}8*`RCil^?3S8m zvh}%X1H0k0=}5b!b1A8MFoyxZ6YTshNauG$4!;K_dJro3y|A7i0zdycZ0Gl(liW}L zmXH1~CD4I-vQaoX#zd1RJHNoKx%EC~i)(tZ8czse)uwa1EW31nDZ7-dm~*?BojK5n z37w7R^GER5B<3_vjv!*%IqMiRtdmhfU&P-V`dI2f1X&h>EDJ%Fg&@m9kYyprVlE6S zi3lD?1Zfx)6oNbexeJRcz)%ErRKmjNaA7*jPz&|X(Y4Ts#cQrCLVT=!<3h2>bChM) zpmS&L6p_`R4E^Ctz$QN#K(xyJ%yPjrjV+!vyD1ws_-0>Taha7m|Z! z_pv3#cDFr)Ese5LLXD3#ZpvF>^fNWLLYQl!tWu2~RAcw6$0OvCl75U@qR5fyP>FAp zq&}7Dm_Y-7dmWhdK5*M}lrJkCrxm#EQC4H>_fKxSa`3p4N4j;IQEMsqW1M3%!vShJ z8_!T0Mw+g;c-S0%Ha0xD-|(~MFlv65sdc@z$RTG=S2HsmmLPDrLZ^PEX%AE6L^A`} zt$D91Y5dIG+_aIAa`KE=y1>bCGntTRCTimB{u9xEQZAD8Ic5lyCy~kM8x=4AN~B6n zeP(J(S&~~WFN#OdlO)ZR%8u0F{P^Ih*dSU_nq@ddtVfNkM&6GBZ^A@(OR?h^>~C`0 z@z6fD*6qM4m$*?#mmQI`c*yC3WcD(qTdHjwd=E@yR37UIQ=DKv z8ITNr@f>TG^-h|2no$8Qz$5NwtrVtVmN>}#SVZekE%vZYNVBnByn(f0lC)E-VfSNE z4g5z~_52tN{u4~=KZQ*GGpv4o4&(SQu=@EGc=)ej7JnV)@;9(P{S7STZ$c%18>;y` z(7@ltis(I9$4^2t|1AXg2UxRy2qAt7w(;M8!*2c&T*E(xoA@8#HvS3R#s38N@IS*L z{ug+Ve+s?)Z}1rZI~?QxfM@wX;dTCRc$0q)@9@)bN-+3DaQKVBhR~Qp*jTEtvvlEL z<3tjhCX(3zZ5qJYBN;+Km;zFo}Wd&GtOHZhlfL(Jn3iTV5~v4FoKF5DPX9hW@4IXZM%TP&*p?^@F7o6=S@#hnMiem;Wj%4?HbvYPWmm+BS1RI_ zQMNlyy!rsRk$82K?Ty`S;)Byjc-%jQPEs2sBkxUj3u{CD_D4m?)Y%GErLm%6s<@iF!;1cGFsEmyNcb+#uAcvzvfoVQ zgFEncZ*!_Ir)J}cpIU3ge#5_LM)+>$FNk*@^~-3l!q8pIJT64!37C$vp3CG+osuBH z^q)KyH9-j7Kl%(3f}l{qz7Z92e8CH$*)x2QYyJd5c*jf#PjErUGeO{REKe(#5P9=)Gq1R_^maFo-ZQ?~zL|LU7o6!f!OB0uB zffAL!`mv|=9^^-RxeCmF{49Dk?JXyTvj;Ls9uRJO7bXCnWTza!r+#CY2A%2WB&~W2 zc=>t~m|ef|oxo8tDb%+DdyqV28{ z3LmmB#dm43E$L)>s4%fj}Nr=JM&KSyD zzJ6r_LgpN;v8HK&N<>+6j`$4;7TLC%8YM}sfEAtp`)hC^zkK|St8GAz;` zfxfyS#ykG_%|7pM1k4Iaoa+NIZx+#vmY7C7?>xFhV;K1dZ=8*h~}qvJ()pgGA4d-{@>0#Vj;{wi(IsZG}JB9CBpscksbCGp{9Y-)x;w zNoQ}ZUZi;g?$j;~TdEg_PFb7tDS)w$n~fn}ay@O?c_LMxkyee(O}jZ*9adjHDqpl}1{? z(WFYB5`LZ*za}-)6bL&!Xd#M`cM#OkhQgJ8h%;27FMi=>IEA;MJxi2^_4M!m!}Z^akShL_xbsb zdfek=GxI;{5kq94PxD3b+Ug!2x(42)mlXOub@*fw3)j z%pq%mTvg$eabxTZ*c(Iwyc)E1!VXPCmDI97(AqjIlm1Tzn3Z6N*7`()k`Fi_&8A+Y z_z9m45 z#m8Exq!)rZ&Ck_de*RM6?Q(ay*w;Q~M${~McMyni*IPI9fu$bIyiwy&wu2_4|0H_{ z=#TcM!x8Kxrmv1yqpBlu3ON-(b8HV^^|mvi^l!Mn6H4*Xd&TaKaq|aIRWqVdusaM- z^G@H?_{A4vaWSk|@&*`vN=Zc)Gwat@Yi(m2sDGDdxq!itq}WtyrIbweuA7y^{sVU-$lftrpdIxC-qa7E~_r9(*Y?U377NmN2zqi zf~EGwH(+c>)ZTSAJS}}1(4XC;%#;yaCZbW zc0hP_z%wjfDV0$6p=?2ucL38qqFK)B&6bo4H|53sdtFHbb12NM_Z4tHF4TQf~mJ^AOsgW&pQxD!U8eN4;5< zUeNp9`(;_>!w(fnn)=(`9f4w#`GLZ2x4c3X)|_U?_|1gohN}{!d1qosGzTqBB@JW+sbx%ba{KW<3n(y^A7lCozwv2JVZ^-B*?`b zZPdIM$W32*H8c_iphkDN(j^b?yRi76J2Nx0azwg=y?+D!fBWG|5QMF)Kj1+hFmU<} zC@g-uK?@8lKuKN}lo`p-X`}Y%d#t93!W8Cr1q6^tRVr!f%&Bylw>FxunHwdeJA6?n z2K^uBV;*RNE;iF+v+c=jxckrhSMY*pzp!Aj45|~AvycYCR0j@_jtsLI38?m zQ_dch?w!jhX`+6DM5M-mV_VI%f{@u)sp`BgvuC+QGLQCZMPUfX*;LaaT&#Xs^WM0e zr#4iP&ss_WzB#iZC0{z9%+M-Nm^oD{7RJ5QAwcemnD$O{b5wN~i*^y4su+~88PE1t zvs{o`RQ2~h&MSM=Rb}y>Bffkq_9`&6$0<6JcA4*2;FJgDmK%zs@q{#wX}5{O=uLao z9pnG(>wm`5627!L13w@K2k?K!()j68e_+r6yfFPjNMYa1*84g$L?X76z$y`;m0+;M zp<5JM{b6l^Q|Ehh|K%`x6c@z~@MUCvXSWO1aRSlCK-~vj`~VymLDUB|0^l4ZeG_yT zEwic4!XZ|D40KePlfix}x2m0vP)!C~<1$dm(RQ3F>RDFG(*5f@erLhzBFB49?eE(6 zZ?fGtVIlu6$~bJDmvb6!zxN51+hU;gLG8^X9DR9D39Fi9yvSs>$(v`x*vsWl`@!WN zXKkzrL7Rx--zpi~tQQN4zEEuWf?$M;7fd5Mc~x zq%=e;Of4*Agb5BqqXYK-{xtF-l2x2q2&)h_T6c-xX1%({<9&YZFNwtkF9V1~NjZao zT&aU(Wa9r2lVsFrDoc{a)e=;zoY6AscP6jb4Kqt+nzk0|4GauCZq94tyT2g1*=rxb6QM3K`&t2-Cz^6I_tw3g&r?# zUAO9OOx$~?tSC0LYRgfJ;o0PuH*~!>k)EnT9X;hqwA%E$ZY9~LW=?3;RTuo;AI@o( zlAz-(Zy0Qm#9zo}P(sUPrYt)eb;YA;WibE183By>lv$kQCWTjA?L=nfX%OlCIn~SC z7+A<7H>z#I-`FT%T2hfFSi5!}^RXJjzWT^PA*`5Q_78QGwdo0TNsu85a={G$3;{B> zRF&E^#?)05HQM#1(+awG1fGy;DS8kw=$I7JZ9_`KmD+{dQ^#RaqSuWUnQVM|y4v&& z6#@87ln>ZX;Yg7t7nDZBk$vh^!!N#U4nbJ^U88^pr*+)LU6}FPs2IslP&@0_^gEX> z^p?I9wROl9?y*HN>k@17k}eB?+6;ZC?jDu;lU=OwY-h;7TnOaOjP(=Igl1u5M>$JU z>$*i5!>P|k_qom;hen^;=RDT!s2NfM$+h9B=HnG6Cw{&0&y=xv?HZvb@6d$7SNjzGW!VVC< zZ9b8ohWdro(xvayQ%adVs(RtYgkNvqu8mimRI26(9SN-S_Q)3#9(XXq-SxLAj?>)B zogr?Fi4^4IL))gx@JMb3C(=a5HOhwt!CT=f!=2A({`?tMV|XKWfYophgPQMR6^Y6` zH}hA;^{=*yqPjLK6OQcER6`>`5IdkPm)-Hxb**>46MdK5hjE(6?Fc(Lu#%`+p7!=Ym-Sjp78CU^)L!-eaOkCh|MJ+=QVO6`W5HC& zh7Ep(w-TnR`Gv!^;}0 zOL#tZH7BT^kG;2)w^+xR<%oZBr9hwC%u;>8s(Qs)s>iRaGO0MSSps3mAL#J1^;Cnr zg%WIixpqudkl~V+wNgNVwE{3iR%2&4vLBLURg+^bZK~)Fun~~=q-6;O;xN>D%DFNurVK31j>BR}4PIk*+phFmX88$j%t4 zg`LqE+GNc1BD>z8XqD8`dt>q2kj929nFc8U2djO!5`&Ew8mQFH0 z@~5!u6uSJ%x)=d!*bc7sKJpC1$P>i~ zpA9~-x}fmo9<`*slBQ3_hG_O77y#M5WI*P+Lpcg9Z5&e-0o(9fS346Zwdi3BXL3v^luInhz7TMP6>Qj}a%}s@V6n($kIx z4R;J2J#ng9k&u8&~KC&j=_Akqqt{@XVE0#|NZ1D$T6ZrgV=(0Ag8R z@D=bS!FR+dyTjqR`juaR3jz3kFT_T?<1(KSyq_Z(#=O@fivNhVOY-xPck>U#KR_4{ z(mg>P78q8t43?C#)W|ihr3~%Oij$h(O=FwwJpUS8{P-!U)j58Sp)(MicR(=WlgF{c zwRNM6tgCXu=mC2Fie9kB?vH!8`j>@NL9yyWKTk*(AcHl090HxQlE-{{bpi^|6dm0+ z#w_s36|X7z+`#g%+-ZLGcT*io37%S@;7z9?z6Xg?cpOKz{rX6CZsmM^WI#Y@uXi?m z)vKx-Sa|?J{mAci_V1RR+&MV?h-&qZHU9{UK5fNY+W|Q70pf9QAuk6Bx!(Z$B5$m6 zAK)f0wDvsrJ?4c81oTP^1Vobl(D{=y z%nj|SDn7qdU%itp2Z2HWM?489Hq9gr1YA5yOpFvW@;%r52X=`a| zNo{E<_e4?92?_|}_ZM6jtY~68d*7WS;Huvc{uA7W7IG{}1GNSYyBCX$0geG0p$aPO z1QBLZ4~r%is~4L~Ej;jdEbt6<#%KWgEn@^dsO0kDnAU;?Uj9I}s zU%#l07kZi?on5Q{pYvf`?;%QLo28tvvb4Q_oi*uEL|4C1n)QNINltG{V`vmOIvpI^ zkt`N8Lzaprl~G@>E#>)Tk`wq4;J0|W{*aha!4w_Qu$t^ZAr1sT3}b_EXkU9_6f)fY z#K4kUVt>`Vp*a1SoY7FC;TZ`;T~&vaoK9EhdMv(4LsFGBMDE1EQR1DU_-mA5Nf%9y zo*HHxla!?*ImernG>*KC96r+$c<~+$B~c9VKT_Cn8%C1G-&jc*GlFR2X7Q2e{d>a*#XgT4kM3|Z&zjBn|$iPSgH8aR+>#Fq( zYXjEno7Ej_VI=~H3$+;90B|hiY$yF+rGI7u+D$v`bR^z)gILB&(L}CVEsY&BVUKm> z**N1z>2dSCiS;Zrz-(;Fmr^7}*h!5s)bT2*5oZXA+26hiWIG5T(G|4yOJU7><)GCP zm(m!_W>3m*e^mHTYuPc>>7#A`XSAsR9+r-I@V+d%4cp&(4QOfH03+yGeVn7c-?P7a z`7m`6+mqZuAM2n(Pb4v@P|2Mxj7n`a#U+$RFTV9- zfm;*c`hNdLG5dSHcyDvb(Y6KM+K=yi)hDH-ew2DhCnBvFq(1TK8bTwITIg8v1QKJp z;cXyP5?MGJRP|du6X4%h!0V-@KJ~#f#7L{l!Hrf~4UL&z54F^>>rXxH*DwukQw#q= zuElW$H9;{};?rsP(+KKu?vt9R!Ic^(7yj{M6C86MrM41gAwx^t=rqI?+m`~}c*REF zJSb^R2Rl(unD?ISLK*}1+Z&6Rl;T+g&+<%=sLEy zr0jI;!oYgRsLSw}n`-7f1ul0*JOx6*j-4Ie!IsEYc@7bMm(xE7*(8JsuV;)?%k+n8 z5OrcZ2J8dd=_0&J%6qw$L@jQSKX$3V`EVVE1mBWr`7|`MsmfmT8BTqyM_2xe6zM4M zUGt`DaGuw)1ZY(>Gl~O zDB4s+7~2i`SK@VspC|oNhSc-vtaRbd)^g{wUbl#Whu$D(Ilzp zXz1yw{dmZf($UA$Nm18UmEglw($~mWs(|9(8r-#Y09K&u`wWWHSQfz@wA1d=;4Gp` zfE;8CuTy7v=ln%=Z}XOJ{4i~QcO7G0A+&#`I6fr6tvMB3cx`In|N0I%U_tU76S&*Rb1%}pw+o|64t_gABLa^DAP zcN%E75g@_8d)2uy@H+{#C;3{}tfhT7g{>#~7WAg%j*;G(8d^n7Pg_l*`ouJXB_V;G z=~i!1^Kh2x0X(%U%@Zv+m5aYT8V z@>nYoNYqS)C3w2%_9Gz%lhtx=PlVQJZou6f9YDwsk$1``eDr6&oO0Za`rfgzjzz0I zm7LqOXf$mWjRh}>mq#K^ef4bVzTN9d(ck}ql9Q7$-`{2CKA9A7q{#7^S3j^y_g0#p zV>?7IsPV{mq2V+hc{esaH8C|o?C#~2B*;8AMvS1|`6;S5ow<~z6qhp8=gWXqWz2XX z4S-G4Qsf{{PBi2asZ*nL%dVvxQ6100si97n4E7TsLrV)66?aQ@5oPBX($ZDa_=Pi0 zTMyM|=qwghlK`?M1nFgVCY}L-(0^d;NV)gVqNUUL79qqVrVkZLF{Y0f*?xF87y1Sz zxD)yYCzuj>n;t?j?D}CN%m?azcvs+j3vfW^&u`+`-YsiG_St zmwF4#+?IdajK!CG8-wLbv=?lA+ZSSh6O2fl^MrPYc+^?dy*XU3)I!nZqh?^Wl0sbV zU7{DS;_4+^Vgu%MEk8>HLwOfP`SDJ4!MqmxSXe(n(yuvM7O;?RsHgmfg3BX&3FxaH zMLR@yC;%WH5(1}7E{FdK8hG$jXO|shbxiRfC8JV8v4D{9$}VmynYCoJW6d=nx`_p? zeMM6(z+kkvR&WW%fQ-z7-PD%6wT4b8%1o$pD^zxkTASxnxPz%`I<%D}-p)VeJKcnR zm8qB`*ik<{>f`QjH5AnKoAn}>0q`hFTyG#Qe2iH>KX`)LSz}4Sy(b5(Ad%Gy(9#&D zkrxEf{o86TUl7(`DV_Zs#TAkT7VQK>Y2GIDBs{Hq4E@p;#HxA>-^(H#wzOi4OY-&s z&Y!n+PGcH#(%S&3OFk`Be#pHlWgpE-+iOWvCd2iDcpeuwUCsSmsGNbz0W@Kn`+$f+ zT?cwOujb4Nz|!srZ$jT)h2A|?%TvB5RHts>#MN=sEK7N@)H-%(U%}lCht4e_5C;R> zVbwmdXkQ&QuhaIH!GiPmC13YkMgJw@X9J4V_ zOWOoyH`IXptD921vTE;6t4)bb4YF~{%vmHYFB94DxXhDiiU{J7-pi}1E3FwV5H{Fo zEvu~I1shasx+nh8W+nf{)+g2!UvoF9|GQ)SlCqk1QdLXO`pxW!6LP$&HIsps5!$!= z$P9+ldjjR}#HO*D4gd>V{(T9KFmX%5vVKJQ(`DTaSh3fsEt<#+)$%6=6DDc7k0^2r z!9!L@ec6c>oOCuQp=2u5r;OeA4o}gX(trVzAb#f_Q zQ7nuo#YnW?OxrYVvv+^6IW!CV#(N;9reyoS8d9?`@$Ny61*yInxpXgZr z%rKDd^9h!xaR3A_t>NR|j372q;kWe6gqEKIL^oua_n@QvA*m=n^yLBd{GYjGSuq^x z)BxP0R04~)g{J{fWAL=A;73!0?ZJO&kX@17v1qL!Mcf}!ZrNDW7|9h_>1!J`3&^d& z9P1l&@xHThDoCCPy6c40KzxcKpU@CifH0$VS+do#3V{C8`kp7rPdcQs<6CIVa5i~a z(LW4c90x1HSk4hKlO?Sxm*}Wr9lpS)f3)-z>k2VZ0?0UO%~v9nZx0or+LYtj&7ls$ zl2>-8MW4BG{T@W}KA0>m&xRrHa4;>1izt7zWeq2+pb>C7w`>rIYqO-Stb7c^A4=xr znR;ymGyx72oFa%M0*CCpD~M~L@w$_9EA5SV&RN~6 zcor>i><1p$f;MV@y%&qgRuFPYb~q_o-?EEvE;Z<+iB`49arkT%A&1m!iB}9~)D&d> z44bOnwZUz<5{>QR5u2GwSS6oM?iB0#;+T>8Km+EDFiJV;!LZQ~WQ_8Uo*MY87O&zudNaG)n0D!=o>@Ya!|0RftyP^EC&bC;GNj{FoH)Ht*hgbP%+6* z2>{k9dw#*V$(ci}Au}(!rOIovJR!<%i97$nEC*I*+TL<_b1&iP=p%hq(|C*f3Q{qO(4*|&@ppc4TVB7d|*MX+jp=j5^w4REidw&Ze zp2IS`5GPOk3ge!Gvm@MT34uIZ1l!eloVYHl`E6J4)-_K4h`OM-i@ohr% z)3uL4sb{J*mAVcK$@KUaHdh?k43CT(#wQD$I(F8Z=G9dEIrUvm|B7DtZBt!_hZd`L z^l21-c_qS}>3sk8OMEvQ6?x-C&;-~dn#3;HHPFrdRr5@iy3G!z&b3GB*pW*G`jVo? z0#?u33dw($?*aMR<6JN~t*1O7cqvYmNmEJOW~fiU8zlP-eo(qYrm{bJH}vU7Y`*(j z&A;Q_lbK@lB`v`h8jk)Yf|h^u?DO0g4U<>n9Iy=SY)j{!*2giGRh1q)G!0l$K0;jl zN|)Q?#J6XbOnPnQ2vsQeyNzlMBz*QU!?-Jo=}=c)qOQ72C)4`vT^dOkXJ!UpvdmqT z%5}*l7~W~jwRyN=rZSNJ4zI?jj+gD(o_cv(Fr|A}_orLFYnEcXetW%S#8t{>Mc6-f z*?xE}w`Jj~y@kEy=4s{rUku>Nm*E8e1e>HM?gmvFGnC4*9Vm_thrtRZz&? zmb2rF_uW{^Pwe^huRn-i+k@(Fb}w5L>NfE4R`3!!r8s5mjnc|N<*0zm9S}b{a^&Cj z$VsLffa;A4DKDoqo_C_O+%wK(^f#z2vv0{)%!<$aW3@Ov1#xplh14>TS!}UPj9xq% z(#pee-!TXO5(t3{PC@lv;hxt>5Q69Id>X^_oew!+ozLSF7$Wu@rC#lx*H939WoKRN z@-oG^gQuaEa=`ZDza)9O%VaIFY%Tz#>f( zah)a3K>*f1z=W!af;oVanV6M&u4t?8u((pxT(k>Hzx0MmAOjG8Ao}VlkfXRu`l>3B zrg+fqOJTHfSN-bN6*6Panpf7Th0zTg0EFnDv4>Pw1vKh>4xa1#A0+7-rm54AIO z@uJ_ILbyBe^2?X|hl-prIOe=vd6D@N=!pdMYTVDf;CzAimy0Hpdo z-hbNLVzdA#n^y+iF~TAC59Y4mn_-{VgSNz*K8SA2>=%K}iRXh~A69(*hzEqP$i9h$ zL+P*CFFXL)ox_oT_+P}`GlKnyuOlzm-(Wra`TLw7E`X1~d?cK25w4f?B2q!>j@x=M zlyB{q7tSKi?=;s>M&<|rCBwl^H1bEv=)PbCp1*d?iNzop7&Cfi8wNWwX1itp6-FTg zMlo?(k?3ZGlQBEb&=nTra*=G!0D>{9I~sfjmAfHjBdq*CDt8R}RdGDAR!^MHs1qjX zu86Hc8$br#cK`MM%_;iGETup{!9Lg%nt@5w3nl`F;C?C32ysUo>4PU;rANQAH%i=c zr%B#6>iuIkmxAID2|p<4n^H~*;z;#lBA56~f2Fs8!UE+!`x{wKq2fU18(dE5%2%2`Qfm;Q;u6o6oWk=NCC7&(51r(+*k5=P);wD$x*_}@(2#I5*<+6&886WnowJw(NVT`4GcOSFCc zU6xA(0+QF~%>w3Y94SKum!9MWsFQZihGYqHgJjHeUW-?~Ci$Ya8`; z7uqLnF(CEWkA$dG^hpr*#qoel2GBz4{F6G2@aM_IL9Fo6RfTHW7M8A=t0^}{ns)k9 zkH>-D-?X!q5<&P$PsgP(PHX`!rC?j64PyjFi;}1Qz473@P9BdvHuK!C1eJG)XW~}` zd|+$F2V|D))?oaAqZ{DBGe)5cu>kc8v}4anst>V{(;p7|1v+L}k(f|07$EY2SJ%gA z$l(ute@mviuhD?=4c$7s<$&rByK#%g7bBRIniB@@WyCu~e#u#c3Gh*QFqae~eBzvo|4XZ~=ENM3i)4j^DL}7anqUu);n36H zCHJFz_dNMEx-^NPbU0g$`%Fdtjybw>r` z<1i?fY-HcyMC91|jbkXibWk%LRt_DqG?0**JxyvY_uLL1Ik_QNwghakmC9WcDY8*K zTSxUEf<{8#(w&a#8vB`FXEF&ouqZmi{OCMgdBS^6j6j_#-8@Wl4-*_-H*O*vVH<(j zJ}Z1EnuG<(F9uu^0f3&>kqc2p4sd0LhKMr8A}tfj%YZl-WLF|78=!N-r$cqwQ&)!Q zLAy69*M#apMsJW*?UOBn&__r1lwIuWG=}bCOiN_-D*m3UY5k_oT!+pRJk6QSe55)o z?(&B@(fiPUoXH;C{N0Na8`NL^HKHZ+PHBoM{Z%7#?%EcjCs6cdat@X+1FE%w%EFz1 zK&Uc7Y1m)B_yw&OAQ=92iG9AL=nVF+=YMqk|JwE1D~3y0KNv)3di*F19YA4122>cS zX4-~b0`=gXq#f#<_#OBMfAXRk!+uK0dCtMDpZTEvNrGRwzWcFi%aFhBcaSK8O{wQ2KO<*5q5p zQbR$DGHgsRE>fnwi->LQ5D;SdRZY?CT*uPS^eUUlRXru=u5Z|b|h7Z?!GG1UKIM*z~UW_AoFwni>4v8uARxN2zp zGw%DVa>#Jb@M5f&+OE8VtwwBtb0)?*XgYIY*FwgE`C=>Pvd7_m1J_7e~cPH;wpRTP( zcc|v6jMU7}QfiP#^jdI9qAY`Omcr)i#^^sy8i3wxnRwjQkm}&u!szy?Rdkk0yb+x} z#NOZrA-+@{%%r9bRrmP7fV(ds;R$&DJH!Cno!65fQmPLxy8 zn+DvyLLDr@+n2BjDmQ$zsTnS$JdhjbnK!|3ClRnWz;*_=!TVTt)5sgeL0#?>uq#}C zi{WHcR1m%&dOC0Bdu2aX(1^(Q6?Iaq&2;*~P%sssggCYqQg zc~JOtvltb%wK@%zefUf8XJ`9@fWKR; zaA(s@iRdGR*4^!Ro39qVaFOSw$fThT$2Nr36YR!(L#8mt{_W~RlLxm+bhA)Id!BO3 zni3=eZQ&5fItf6t2vMjEwXmm5or@JWjA$UC)Z^=Wt3%BY{|G~@Ma(k`*!c*Z8Gy_$ zMC4kMaSnCy7`v`0t_?AC=s$jH4~_EbiKf|gBzgz))kt~_16i;>*il|&)o@N=c_iwT z5lhn6YYR{Z*n|J*<~`%czWK)P!7m4*Q(Bj<`ad5ac3OBB#_34qm>2Vj=M%#fYxWAg z=dbQg(@a$Pp~sZ-%es3+`1DJ2Rsg1{z&BM!tMe7Q|c>pvd+R4%uP;DkfVMD$9 z?zTg@@#*$W%*SHr!^^>wRJ@=={lg3B^VkOBcz(dl>F119iNWkx`f0yL$%KQ^9xvX& zvt}7QSGA3^*i@RUzpBalE8x-(;w1^)6KMY9)Qu`>^T2-YUOQD$AB@E*+0_%^T781tt5GRyY z=`}OY4D3|4Yq`C@KkSrXHb?+GfHH+|5x-A#4*!AV7yR;DO6hk-U$R)hEoYt5lW^q9 z|HiTYBb6?;>gAe#NF`^u^naZ&_y9R0V>8?T_o!0WaryPrVO4iQENl)nskUPdSmr=e z(k|9iUPmFyP?3{q2(?yB+Im`i$nkUrQAJj|y^eXKdIRCv4`w}wYgHbe2tGJXW}Uu8 zeV{yjA*%bUxIQeBs^IhVwyf`S<+k(rdQ;yG+<@(Xx^5nl+~hVuHv>53_&z^cqrYP; zJrQFDB4L|6m3*KV-^y8M$;n3cq69)Dt^wni;16=JFy8I82O;PG8E*tzh@5n!$zG*) z!YA(K;yxB(?Cbd!GLMfAijjC*=tLz&VQ;9L9ChR&7EVEup?rgUen2ciGlA@D;!I9E zq^4LnhueXvH&W0JDFZC3{Cd~)S)0q1$qbDOqh4)JQsclIV1a)8lY#b!>E3v@Dg%L* zYU9VO&P$m==LrB+z5CnIQ#b?O%0PifIU_0SZyDFH!V4k0+yKBU26S;PHI^tW*2r^i z>V3Mo&syYHKXzUY9js&|8L8!u_Y4o8P@4~Pz?iYJ+?n{(EOMlYmvYh`R6+QzHfBpo z+^H{D@q#zEwYCBqWe9eQ_!m2Da*X;nYCwP@)F3|GnYDgNF-rcf$8D&}y`(cK)!=u4JM zmi$O}hHQXRt2F6qfRAZ|c{*WP)iY=V$!d5Ul8on%H7#8$Je18LzHD}|27Ln^t)rh@uyY}k!$-f{~*PP_ZP(z+D)>cVIMZ~HCtJcw~ z9CS)Y6^euthw7@wqtqU{)cm*tI7yZITO|C$z;nQ9S@KdedM4;|Rar{vO0?D%$AhkN z%qXIfT2%RC_qeUXs+s~@9&yKg6A;t*4xz$^LtumHsW zpx|@bN5>JM)~D~8Vk>(|^5;z7~5a8JReMs~< z^iaI2zx0lJ^XfS@d9hXFwIk_LQ}=h)4;cWe(NNua&GJOh6_BUt18)(*eNkd*(%RMi zcNb=fv7j(G+Wx6SLsdR$Q2>sXm31|qGIavGgxj1z+>EIoIH7EWi>QDi#FG8o3jUf5 z{-P2aw-WsCVwBxt*j6)!RZ{A3aQFE#qHl3crxOR|JE{60&c{lBdcqIIZ|diQZ~<6a z-_38s*rt@8p@`qt9a?CVue0Rf7{4>wj+FJRa`S{Pw)33p!!lUz6Mu$Fk8(Bg?OSq^ zt58WunO4npt`2qqJ{Jz~Zj9QuEDfI(M!bLT%-vZU`3H8@YjkcghIdyd`+&dG*VpT& zxJf&;dd}+xtz%-BK6?`R&X(_b#RsU9p=IB}CbWxtw>b?s{swC2m@SsF{4mL2VxSPM_H}_mAXGuDU1IFL~&OkIF zk1dYO3zL{Jq?ad>;Mq@+Bt(DdfeWM@+YfI96Xw9Hx{cwFT3`$JIP=OWJ>XJg+;`y# zv~fidoTL5_VLZ^_nQG;WHa2MyYSn=3x1LUXB?W1Og_6A^xnxXhzB|uSf09M`J7AEv ztfux!M}L&nGn_a_%eBttfz3Evw_iHJ<$_($ptjf$Y}#r?iJq4C{&N0BXBRWAOs0=1>`? zP~$?8>Rox~jcty0=rMU&bTKqEG*#7EMxJ8A$LQ$@g^Wb(&(nBkU-#$ZV~VNl{pP=& zTP{!BCwwP4Tb~y^-!;QL4A_ov~CHht6`Hk?F z%$MXQO&2jwslyXjre8~x0Jya_WP~lOcbLR1JTarTd6ZKr_LK1P-?R^p&4I-pB;6Hh zaRDz&5i#d&M~-qPgJsxuNd9s_Ty@0i<)V@xeUy)utaf_@c4n&ilbHcqM8z#E{-_mu zG0+z7De^V7Y=aB!!S2qZ7Dy#9z{Pe;&wX7?oLLdpFpo+7$ZuHefQTjLYb-@GCN5MO zhQ~q`o6YzwwqE7DqoL-cLH~SY8L>qyQU|#>J92mD7U^HHbRzWhl4shpQo+uOM5B$* zbN+FDK_x0Hq1s=Nz=Di7G4T3B*pTnoJTSwWG$^}wPRhe_iR&k zlZT#&;-vEfPeNz?Ucn5v@R*75QtNcKDxET>ZNgg-QY0iSfXGpM{$&+yUDgJ-T)EOH z`#jy{snM=xzM%bz%NM!FwqwgYoy9$KUCtMczmte*TK<=>V7XkvoEpL)@JXp+#>~ld zuD_$A`*3pP=E<+g7z@Siz`xqe9sks%yM=&i6ADz)BbKY2%hWAvq?eo)lWQLfk%;gk z6sSwvS(~Yb0wzc;t(vWiqGl8+=$B|67SOL()Vy>{g#PLr@auENtH=M_wrY79N(@e0 zQFHpum>SXaC-s{kVD}%tcmBH%s9V(kVPM#b33 znJiy(4G_<0?*qFBHp|`JkL=yq^pLU<*eE`3+ktvzRX0cZf zX@WX(b-s~NYDWNh%Rt>6n0;!s&S01o0-c`W^pkrUdGNB2&?*D% zCs5)%PX$bfk{rB1oo@e!13V;fAbj)hhu~dgDeYXbDBs!w2vuA7J zY--*`0CJVM(vWvW#HZ#|=hSOb*O((Bq;trYahcEfiDbD8;eKIJj&-$NvBV9XR!$14Tn2@$V z4*>pzXX@#hGI%|q(x86HUj%f&3frq60vC@6t0Riih4qQj*|U&b>QoQvuM}nH*#mzQ zZt}bP(-nrbHRE5_GnZW1+!MtEB~6y^<2RcZI7Ph(A!5EWoWj!hu8nJ5K%Yn7uG{GC zF7-lJy#~WCgj2c&Tr3A;aKs{(00(slRe*A=Laz>%g9*7xH%H6(9AQ&&K7G{`Z-WOW z3tzMhMUxJhOQACh=9TGi4QjulQv*q|l~NH==5yjC%b&u#FLKY9<*u{yMKO-syRI%ze{a!-NW$8XY@9PdPuw877*w` z)8sw{(;tt*XVK`sWp1aa4Eq7J>>nbaPm(rPtr|{P#Ia#o-nx}un(c+~Yv7~I0Rsfr{60^YQ!@rT03acBedN_MrZbrF0snBA$Ffg*c>qEt zU+f3RjSF@p9}>s~K2JeQKp169ynVPA3t|%(Ogc<;2OvzysvtdE3W zirg6oIv`BH@94xRKGThw7G=uaNmBWrnSY_JpsW@ zOG%M*fIYCbajYEv_#y5lQ$9-FJ!d#(YM{h^phRpdpk=!KK>_}6Jm#j+}x69qS|@>M7-Iq zw3yD}IGLQB^10e<@&PVj6&&47;%+Brjrx6e7ky%iz6a16y6>0;u+p@ex(iPa7Ih_U zlAvON&g9g*YUv%DAI+Szcn{}nUZS9a1-k>*{6zGf^reBHRE%0|IGHW-E*q!sCYw0^5wGWwnwxyhjU~W6rk9EMjok4)4w? z55i($T5v{tad_zfCabH^17Rxu)WLCpEt|In>4UIRM71fvuu*sn7C!~pEhdCAvDi8L zS8kxsYzA`%BKtQeFdSii8U{_Jnc=7$1gPC&fi$*i#3I{*WIS$SmOr)`xBAfu1D(;V zz!gc`TsZKIen3f&(gCqcQ&e=YU2M(e<>tOI4ylbkL$@=)Il2j1(Hs2;ox}%=O#zmf zv$%wc5rE;|9DQ$oWRaSJVN^b98^q1QNlV#k`7oI|)K305G4FhDkveHUOXXqYZf_*5 zFZ`7dH1BJB2!lZc;cHD3m!F!SAMETwdL?AYl-jR)oD z7nEcX_~3l?Jk>`pRDW;()c-+eBhTrjXO)x`;k)exJ7ay`jM9=^!ZN!c2Z?0O%UYOG zl9hcm(hiep1=(415rk`I5fa{^hgD1sMr9SEU=rj0`ROr9+@0S zj$2e1n1j1+87lGIy!_ns(s?t2__#tPNYZSFltxi*ao%F=z@{(|bBeLf%r2N$h&05? zxmh!EiCQf$gnSw`=u?M4gAolRwL81Cs3Kd+=egMZ?0YvsCeHH?*b{hdFL&3ztx8 zt{d8cO{shfCe>RG)T~Un21%NGO{o-mZ(Q2>>qVbVQ-9o03?(iof>Jk3gmi+2hRn>* zT`+#!@LuQja){L_)eVbau?z9K)(!0y4%fS(gG$}thK>+NsTFZvA(yOn3+7 zi`JW*++d*_-X&a*!Fz5;B3KHT{ zQ>Xsfz&2Dy=o)jSd*+7IWOuHD&k!7%qM`se1Hnn%_$T~}jLR2p7^JM`mu?uS?A=#_ z6_OWjX657%)7fIHO8aT)bu$90s9PR%by71rV;TgJ&1 zghl^_cO-E}MH<9nk%X+}g;yup(qyfX0=Wxwv!&b*M*+APJA9!wsU^AdBwgCFOI)lC zYv+dXiY^^+5*evehPhcBN)%Rga>E2w6^~0(enCd53{MJ*+$>S?t1}X%pnp)g)NY3u z4n6cZl2h{SOG~;X;Zj5Si?Ok+JG+#4+{5YH&CPnM67)LEg2LRQEDB20aOl~p;llIs z$($2k#uXI0ndJ3-te+bOt0@dXiNkiHpb)Kzm`@IKxCBAcqhK^`$O_XO+yQTdh{vE? zLuT_Y>Fs92*<~d4BQ9*Hsehr#Mp9Hn5rmtiA>!Rard5P_W|0T8;UTht7uVT{)-Ar2cq^)$b8Hz!OqkqUNnMwAxXqFSc zNIXZD&MQ<{wvD@>&Ia5?G>5oA4=2wb7p)6BbgI1@J<2)gv@(jS&;Zv_&3SA#sV3U! z(b8>a7{3bC4F;nwxMbGbv$z=VYzkSBB34W&l#tz2Ua>`cBQ#||4hGZdT&L+o&qb4=-|E;zm``z-dx0Fowq>DX8yBNB3EZuAy z>CjW`8RQFkWNuca^3|xM&gPYy?NDVqDVUF=)U))n$_>L{D5>3ZZWy9c&y$}#lxkl@ z<2^e-mNaK0DlbchMf3lccKZK9F6p49D*tky8%8L{;D3M{E>mR~mkd{BZv^xpEx0@8 zhRao}!)_RG zjs}UM?0+-%IXRO5{Hsk7Jnn11hu6ve?G#SOK!wMd}?0a4luD{eMbM(bak6?~;?0Pt>qxkYO1`29#ER zHj`q|qFJ;b``65(JzNPRN6J%ZvOEti5jInA<42PpM zHpo}+Fv&f&h3@7}B>T8mV9-dXPN30`pfe40%qhTi_Sy{@L{XwZ?x(w9fDB|g21Kq< zaDV6Kt!1pi+t98`Zc#CXpZpTyUp8+i0EmAP^@Bk~qa#bAPH{+}Ikc~)MpfRKE4$9d zvny01z9W<&qPA8W*j@mlUCc*v-v*kgdF&C*#_2 zz9k!6I&&r(W8TZfdz0Q9S%rnUME&TvA%C6zWcO5S9HkHMiye4B+E{4N=e}^q0o0L> z-AW2n9r_k=f9`>82lFA+b|?~WJ_^8$Qk1dg7Xpoq5Ni{iSE8XC{8F{}qDGXp5 ztMi0ZXGfoonB07{;_Da`4ca%c_*n9e>Mj$K^cKeup=tf{09!1M>s>_1NIQiXIe&yZ zeqNzdGzI4!D6;sKihO@>RHhE5?UqzGAIYzB!7)A^1!h?An9Snn*V-A2@=IptmgHqy zJX-*lC!#}h3yX5Ivr2MvEIyOk1kUFyjw@p1pZ0Jqj#BCyTbf^zH!pXB+B*z2!hz-@ z3bZA&g`*=9?KDiypWi@JRI;}9A%8Wn=ZNi4$J?C`sNt3rF)z+5q>IR++?MM&E5`E-Vyo8#<=8$?MG{QLMnNK5ZWA*N>a zsx#dD0ltQ+*CH#Bis&x~4oB@cbh;hod5Awujn>JiFDr*44qmR{K2ra9YEd!mg76L4 zKZ{tJT~LT@^*0cKr8ZDRD}O29$RBg@M|q_iCb1U8;mx#JOvwCgoPvmMC8Qpg`$_Y& z=H{vWNi4K>1y(}+)SqVf${xx9|ByM537@R zV?Ml2z7ggl>f}9`kF1k#jQOZK`6ih6*2y=;e6u?F=J?N7C*K19Mb{g@1;o_J$6~%^ zoqQ|&Z4GVk*F)!}vVW`{)&pYF-g$R$-W?&1?z7NYrF{EkIncr;-wDn;5jsmaU7)Lc zcY`GP?(V!Vg&y*q?7VwIFZu56v`>+6IGtC@cVFk-&#CY4G>|NiZ2HkFB^5bd(ifQT`oprGGbEHF*b2uZFDnDww$+!s7kaFtZZhRgj0tt0|x7 zkFSP#{+Mbg@FzAdtbzH}u+Sf$SOeEp!xDeIPm`&oexFti%ltmQ8p?deKIrQ+_O63u zKfbDAx!+#}%YXN{s^J!qY3tIJd(RG{ioY6G&yl&MECg{~5UTtZ60 z9>HE8LIkUTrfdVWWE-IatAu#A3A(b)(1UG(0cYSD(%>ItF`vYlr4koi&xRP_o zvrgxO`h`F>{!KNyuL{oAFt&7bnSX(H_d1D*SF3UsvJ^A_4v$lNkVcA#jzDA84BsY+DJFy@qFC1!+8vW?%)D4RadSX_lm#MNy4s zpx4M$Eu&P+pMxzCK|x~%#H^ZGNOBg56lakk2`)niu_dgKtDFIw;0~2y6G5=XGPMES zKq@nFrD*D;z7LkoVXag#=+z?*&is-ta6>fs?#1e98MU ziw|I3crVt24`qG%Wo!r^!P0puo5C+=b9g#i$;YsAp20TracmpDcYp8+>_tA2z0N1G zckq3jPhltcmF!!775jxxM^keZH+UAec{Y#cxx6Kx#oP1QJc-ZYgZW%OjOX(-Ucj&9 z*I=#$|1IP<@J0Mqel0NOV=Wxh@haL#y0Sc-m=R4JLw3dNgDaFpXhOLv)+$;sR>Rs? zk~XuB&oF;<=gfXFn14=q6fE?;SOWcYjE;oI9|0G>wmm9e&zFOVYSJad*48*&ck~v^ z74czu(DF@ZU8M&;NqU80*x?4S`7-eEo6z!=K^$KJ-T5uhhu;bV`Ry=_-w9LrJs7*) zhg0gtlAI~Mg;OHMnxJ=~$$!MsWMXMDp2%{!%w^fIjAS6a zNzBrWt66{IOMg9vHb4UcuCIsg(VnL3!5i&qz8)f?Jv~vwqCLIK!4;!t_OAppMiCHJ zsm`z}#;kyzgu!~~8tq9&v*c+J?eXU53o~P=M}(&j7CTv@YOFFA9b+PC&1y`0!4sa$ZX}uvD9=W3nLUwVgs@eTzhbJmO?=ay1QKQT+2+>yqe;; z?e}WLa{BEk37uHQ(uwdPVv^T75QFY=Wg#IuDCgNhInPGxNAS2)sMj-#T70$<6gCSowh z#*=eO(|totw|US;sij}e^l6_aYS?78-s1m?@p%THDtw~xp%8WgkpUO2q3gkguaRi0 zbd2SYFlHr8`BSCkLAO`qvbOJ^yHXe^WM!)cx}L2B-E%IJ*4-e+Z*v0WY*&CL$$EfyUgS+yihtoVs#s34shC*YAQKJA#EBGANBT4jnUhTn z!jV)t2zh6@Y~Imp>Wg!{rm-XwS!O9uqfTKm2IE0mTawoJ+tI79fo=@|Rwic`AxB&w zID)KAC3;DcJ;tBdGZVweVk9%M$AaaKa#&JB1ME2wWY38pdrkz|bHZUyBRI@*F@HSK zAr@Ycj5086-^FGU<0Z?cpo;^-4~;}T#0qpiL}!Q>T_8zxh08<=q=|lzAqK(}F$A*2 zP?#@|>>COH5NYtB7z5?v3fL&dA}cd6@EZ?riiz-%n2ao(#b!G@F!9dvGMza_ zWw~Nd&-$JKTAjIakHRBY6_K!m6@MUWD%ZmV#}cPk!sS@9sT>mhXjZNXE<~`@+14N% zMEyb?T96~?tVX03)P`ClU_X7y8u$k$&N@~tCvquNz)du0xnfZy98jysBsH#6cu*A% zN!$mG66@ehOpS!cHb8i^mZ>e%aw@@y)|M$B2(mnubXG%f6QslHjIQONC4VZFy6*T* z=T)QZlqv!?!+|Y-BCbpd*Yg}Azan>V$(bHpa;CHSXaUgGLk(MiDP>J>gSIFLR{|GT zfi0$kM`S`vF#{4r4hlmq^cJ&VsF(wni>qObmeJHqW#b`em83~d4C66hP70JHD%a- z`92uv0A4NulRPbN0Pu1JSXLv@ZS+PMx6%;HDOm@D=}u{Z!r#D785_c!1UaR_z&O=Rz3*d>m@i{dSKNxTiOiDPh7ybH(0dvHp8 z0AGpY@RK+JzloDjD?VYG_>_f-(=1AS&YFvVp-s4hg*&Vrm&8gBQ58lx zg^gscacq6hygy3hP{%wAG_D~ZePhr(Z)Eqef6yU5$}yQ;4!JOpF4a2PHXI_69bclR zeTAC#H8d07pr(Bf{lt%GcK-|M;#Zg;euJsv56DCs-!tkDd3RI`wr z_Xh)%&m3}=D1R!pP*jX^s2B-l(bB{^zIT)8^POunBefeKBF1yW2C!p1ODm)^?D)&n z9f=a7V)7_eQRX<(=f^Gnpd*af1Zh$tU0o(qtAkFj^y0KIT-4prNW<7%^FRl!G5ED8 zNYa`>PpvtO)O?Vw#X_;x3TONPTjR|5SDZ2J;}ryUMt^jL*Oq{>MWy`QbSlll9J4U9 z8a_{yHpHuI(v(Uw`w&jzp^0)M$fxbC03SLPMpB)2a%bjqKRO#bSb1o&w2hbwEuGB- zL?k%b0``bA*#cJK#H0mm1DRXd?h5uO63T{|Y$N_E_sLIZ6j~hES|@0t`5{q@hu&HO z4A&Cj3V*FLWZ`?3)(!GCWI20`Rn{Q`jb0icgQm!^^)JbwOsQ83kRfreqJi$!6Ojb% zs4T&&cc#)rubxz=d6|yX_|PApSdSQ_7sJu*AYxD$Q5qyhshl{IsZGdnE^CPdw7WW2 zl0d5?4H(sGeUJowkp%sa1pQ%%HULIx17Wf@2!Cc{I$s+KCE74t!yabq9COmbk^hxS z{#PjZ9}|@St;)qvWofJF1eKDpu7X3dXRPaiV%?cSc(PE^Q%1X^X(8Eq{hq z+O^PLyABex>ruX!pq0A;GPE1vO6?|?p_SppUtzC0vVD)#6o8ZH^o>VM_wSc`6VA@? zej>*~BF90h^J%o93`h%n%S;aD>Kr&Jw#uZlcUr|>uLtpUf_R7^9-_L7f|yVrqFiOV zCCG5u^kOjN8A*Yw=@}Xdh-D~6D}Rs-rC?Qv=vU%&cR)uOn3`}HBIJTXG0@2%BTmYA zhsjjn(B`B(cqB%glx)&uirA#fR9f)Rrawd=OYTHG?t(DwZfL5lg4Wu-FhN@b)3mi{ zW*&kf?P1uYRlw8Qqp(BU2#2-D;C+lfKh{v0*qedq2Fh?m8Z!xrb)+64kADy$j}jq| zQeA?gBN6;aG$rcqV3ME&W|zd?c2vl5kdJKDAs4HLU4p<|+k5(XxA?*}`Iy;}(;Wl~J% z+{2_3k7UcIhfJbR^BEhV$A512KC0gbDYnn1F!&>%P17LRI_9W?)o5l?H0MYVHCP@X;!_|`?^e~YfB9*_{Zh!&!qq9J&)f%!N?|(HO1=DLM8&q^E z#pQGDgP}fG6+1x$2~!C9!Vo+aepJJLNOpVOYoIBWeT9tnh51avAPjNA7N=8Om9@`R z)=u$zjcWFjMB4IM`{2oXIJQO{Z8bGjFmTCQxRILNiiE_Hv&k->yZ=aa)7uS;%R5ltm{_ zYILizHlvc&sK|sp8jzZsNNSYGD0xXS6#r)g_>ZiKV*e!pFqHskDkjH?HN&EiFd(^3 zRYGg03`vIn$r_cT`qM#SdDsz_8xWCe)P1f4`p zr+u3Kw9iI~mC|&1HIg2SK$7&>YAlHavX7(zwPGKPrE~xlkA;{d`wS}k2q~s^v%(N8 z6`+~u?=wP|G=H$2PU2P*L1QaXbfjV2Ug2Yq5<*2 z^&F%jY>R&P%hC|W!_}N&%0MGHiE}iVCZxegPHT+C`og7XY{xEq4I>=-Ao*bl z#bVLegLdO=mI%W+!!ca!Luf9&8Ty)I0XMLn&2~Z|=6`IgJpz-^0Nd!E}sns7|nDIGIuAqwO#1gJd11oZfL9Rfp~2% z^w(ZQ=jLUYq`eB$wf(r*9DoAtAo^{u!&2=H^xNKqJGH}bk9Gv^*WSW-?;WVnj=@&# zUD&I=2d`)+VZZhX9MVp~QSCImt9=G1w9nzR_J2?KQu_ja(*Dhu_7w})zG2bYx2&!9 z9qXX|z!J3|S(5e>>#O~jU7`KVuF`&Ex!Uh6Pdm#BwR5akt7Y?bVAtt_Ez>o&Lf6@y zy1~}yCR?xDY>OVow&`xRQx9iH^a%Ez9?3q{8?&$R{e#|w)#^>TsW;>8bRUn?V|bF@ zl7IKpTl2ws8$Mib%hU8r_*lIipQLx-)Acw$TkpgRbw6LAC-9r}M1F_fnXlHn^Gf|v zUZwZsyY*gtuil%#tf%mOdS8A>zlk~vbiT60uFcQ9P$F6R+qui39r0;;6nt9Mf+RAL_S?kM-NcY5jKbg?92sLzlyl;gU0#+h}925d;K-UCo#zR?Fg3~(0_?4iW=%1{>Ag3}m!k*B&_9F;`bTJ-e`dcp6R2=}*rABk+Gw?zN-I&cbH00ORKh-a zvBp{A8qsbft+N{;ECCm|Xn$N(@qKz!W$g#&d$mJ(guJauDYqoI58~zG!9y3&^e@5I z&wxw+2Ab&Kp@94c3H=jv*Z&KB^j{G7-;m(Hvp*b-dB8csdsD908pU|8O0R=(-xl;g z)@R(xV9yie6aCo_vgKCFLqUh9Z~X|U2Y9(hZl~N0iIQF>lt3zv zl*{CmFe|v(@@7z=-*hNUsm8R4AX8Ctv%!D^&eBO#p8#GoMlLXnFbFfk!D}>vHbx}$ zFd9Q2qbUqDn!!lJ2Y-`|4lu*$2qi`wtS~yk-G(358u75%NPz7|B0Ot!hUc)&%SLxN zWc0uhPtj#TdG6C$9o?};qMzuG&Q*LBZ$m>EreQyQyrpra0$)}3q%^d3l zVX-kbgu3D8E#&@+#$56el0XN_bgmwSGsdHVxDf@v^B7F2 zDELmgg>DQ6Zhs5`%@_)%F$}_u;Sgn{LQ7*Lv^Oq?L?aEl8|l#77>#mq1zc{7g>F&lwRtnqFFreCe^H{RT3k{{9<+3aUvT9_y${pTLbROf^$vlOAwjPqHnM-nbS? za~(7{u7}pf4bah83Z0D`QB{^fig6PXp9fchYY_s$?cuNDt@gns>LOpGx)=F&@V245 zY4UbpHGgk~b{@{0?>F?QW8D=Zw;>|8LnC7)_>4Ot*0>9ixd*x!tKd@OUhLaCfQYzB z?l1$F7b~^SeI;Q!_oK+KinovA9hP{KDxf>zCn?yu2DZyh3BO@PXYSygs3t}gL}%iE zF;uvXrloc69|^U|>J*+uu9Zh62!ZYhi32stOi}tj=+EytYa8UYb>VJLl z8GndRDn38Utw2Dn1GpET-|<ZdG|dpg0WEd0>a$jeMpQCxnCNfS~NuQ_)5i1gqwzBQVY~{p#y(~l`&t<88Lgc!#YtjX&K@^DVtb4e?0MrPJ8FEwjv1e_ zFO1Xdd*d_qlkqQZ8(;EB;|yA(N`IW8KdVLlDE&<=+P;+XWg>f>O*7Q#OT9)?74KOC zw<{U(%QlwN#;IpHsxrKew6d_>y!YfCJSD~O>YkXzgi4uSyAB%p4A0aW-hX0c?RN^H z#^01fB9^96sm}-imPpIN`5-Lz^pTxltyl9zEFq=8&54ZM`1AuhIs?dX%74#)uEHk| z=S1_YL>fQ`cBaFra4$)PIQ6O&U^G69o=Rk95xhp1#zOlGKL7$!$jvL5k#Mhze4 z5RHy*&gIs>D%B3I=EJ4O^&r&p%lHUPMX=lDs;ogXb`wvPg3Z~wz@ZL%B)C#PBDWcs zOjQNLqIJ*_#r`)G``;nL_0w@_&pPxNc&!r?FF>>7lz_17~Mu(p9|I_d&F3HeNNO%Garxtll52 zo*1g$AFMtStezaIJ`$`p)E(l`Qv8T>u}v<}F>An%;!|-oi{jHl-HkwZIKB@$68Phe z`coho3@hc<^Qs!Inl4`_F9RSVGaN{?y}n#c5(*+c6z#OBi+@YE3V9O(d*o1$GU*@` zMDbi~=v2%KRg~?cyP;H=M}-bTWvT(W#+!naxLP4Vy*34>QXQzG7_O>|RkbNU5ZdcZ@6cW?r(ev2(3W5vib>ipJqfqU5RkrQ9DVvvu;6eI zQfVDXhXarf*MEg{xGto_=R^89aN3-W1|*L)G7Fj4yoR+l zi_n;qu*=K^Y^=EujmKg%9M_`JxDJiR5>{&7z?Paz*-G<9c9(e*yWcEhkC->JC(RYC z+PsCmVBX3OnYXid%$4k!{-p$UL_wX=t6>nzV%e&$`*}R|kGgtEw<^z1Z zxrS$%Yk&D-d@nU0<}1u~e2rNS9{OnAIoOI(U(#vk=)W(3QO zK$$cjv43wq`p1XNB%&EhmqF-i+fRz(s|fXYr(cb9Xb6x9lpw{a^+4yybKp7{LPtt! zx29J-ZF_8YPL?rQ6H4w1CHGKgO1wlHBnOFsL=8ntqJfh-5=nuO}r&RaSHu#7qbM1~6007h^CB3kAG(NQc$j?a;Vn_)CwX^Ei zqEfbt53NLmkP^zkdgN#ts%%nxXh8}H@g^n2PFjiarVw3Fy<5bG)+q;8H4@`?rSgH= zYeKcVoZ3U7+Tu{{q4=HrPGuSbwWXoj!%i)li>SJ52~oe^6*Tr7q{zD_nuvlSa(_+H z;0(V{-Afc(!545#wQ~U%OFPH!g0AS6_R{w8yMyOed!Ybr>=tNdZiSZSw zw_H5i3gZi`aK6N9#P6^oc!lNRHCAK(oE632u$u5wmY4rzHRFF+%|(>u6Ny#}G1!V0 z6RcP<&1xxbu-b^_R$EbSwG*4I_F}u$LF~o%D^@3Q(n=8DTb;#OtBdBbx@paGxL%S14u@!7Wwd2(U`@+11DAs4Wd^T= z#&T+IIW+^z>90o&N!Y7p?s27rC91bOLHNQ%!rq;HQ=;&>MSmitd|?TDy~b#tJ8`eq z8tn@k<#VTdE%cI5SSrt+M0p{fNU!zkYtOz)o0^V1?ciHdOesW8L4{}^lq4xe7KxGI zb!6xYG-F5c`Bc4S{!{1q9_TYpU~zTY;KL@!|0f&?hd=Byy%beWBw6Cyy_O?OmLp4+ zBTE*^l6A4NB!8K*24)eM%5sSCnZa*BMo`%%r_A{T zd<21%xz1t-7p*jv5EYn!ETV-GxyHT>Vpee;W_4R50OBs&<291QrO<>+p`nqss8;gk zug|P|@7Eh1Pf|#LQ7RC2cnG$Hsj8D3VJ#Ll3Ke-9p?^?2a7uL_+cy6PK@~CSAWnNc# z)Vi)R@3a^4q7&vVl}AnV)bIbtF>=P%!3MuPHNKC&@`$7ZUju)fBLU|CnJ$uHtJU%& z6m?@ROn;WB8*^d)z>PU;2P4O7b&A{P-Ut1CZuF%MqP1JyJ)@gY#)A;;NO@F3qR+jP zKjFuE){3sAx#=*{U0M5bCCDuvt(reA-FA7EEgsuj=(l4Rm8uD*c43O%FVQ`+cSUl9 zH$ty~1>T6Y^5cxxQ7gz5M!duJ!4$efhl`TDbblX4<^nF0Y+6kcFB}eGiPyE0S9xtB zv!l9!YOgCtw$L+Wn=->ySzBEefu7~9%Fj-6TFKLie!RK`gum zf`84Ie?{kWn8tU>`%tUErBWF8_u|jep*@d=u6#G9+|Y-6g9FmACml z=2iT8ObLiKGhh^d0sYUG<{18>{Ip@N&iP9?u4#;9?WCV-nO&j3{DUN6t=|yZh@B8ZP3oT9XeWffZw_kx>@p{tbf3R*8Q-~dVc^O zvmS!ytcT%{wH}UJkHF_v1^i@fgtOLTEZlmWMWIYKMY|be?P9I0XIWco4{L8d$KtH# zS!ZiM>t!8agRO&Xq;-gmvEF18thZQ}b(Gy;z0HR91pV@kFq(Bwgqo*TfB>H^JLq_``KZ9pzY>E>~KE9Zp1IQBYC>rn2*Dl zZldkwSK85ht{uw@?3VmmyA{9LZp}ZkFX5lr?fAd!_WVn`Bmdrx7q*RSyMNtTbg;XM zZgw}(+wLg_*}cRlySEr`r-&@OuUKLa5X;x2ozSY;0t58K1VM*A}Hgq9wlD4)5Y8NXz`&vMtp2vAx_!j#OL;S@tr+U{Ay3q8rhRIpFKs3v8QSs?JKn| z_B5@heU+ACPuB+9nc8SOOMe?{&(JdMY%SN$(F*Nct=OKaEwN{5%du>wJy*Nio~J!% z7if>#h1xFr8toOkNZW50Ye(%8?YLd4eQM9wKDQTWU)u|{@9jm}IeW3r>}z$meVra* zU$3{Ym*{Qng?gO5Ouy8=N$+cy>6h6z>!a)y`b7H{eTsdXKFz*UpMPcFrO&bN*5}#x z>kI7F`eOS5{d#+?zQTS`zs-I~zr$XyueQtewe|-6Vf!)tQM*##YH!k?wm0k5_7?qF zd#nDu{kVR>enNlCeo{YfKc#FZqZl5x? z*q<8D*r$y>_GiW`_UFc1_CJk}?JtZk?0*~IV4olDuZ`dBZ%ko-YZ~@Q z({KN3cC~*qd)U95eeFNYLH1d5lzq;ei0^4GX6CrKIm@M+^M70hSoB90osIrf=MIzC zA1#+bkG0Sr?JS8)Lz|asx85tw1;|udaC=hTZF6}L>;pXTnbt@LY}1Co-g`dWra`z( z{{%N0;g$!{&352+3BYY0g6r`tTae@KUG$~X3{mY z^9k8Dh+W$tc5T(?%Mz2ubeYdp47RHTnz>4$jf=L44-gbE{~u6G0|W{H000O82Zl&D z=m7s!z6A*Y0QeY}kjM%hmxy@|4S!|X2YeKD76%I5hd%x5By*INv?=$B|-S>U_ z_CNpm&&+?G_}=?3pH@mu(8shI(^=?i>uK%i?(J;t!QZXDD<{%F&g%A6OMeT!l}c+> z+u6Fdbz)a*_wtEOTW6uYuTqt16$?rx(6?HZ=O*VTYo)C+Ri-ZXU0243;dlzg6a9E9 z#gqJa8pV_Scsj*(TGbfwcs`x2Pg!xwUUQ`>gvd>tFvvB*|Y*0i%t@VsJG!hcM=X58R~>PNGw z_VV?PlQIoks|qh4Z!~y0`fF9`<&!DLpd+ga4Cmz&4lV^RLnRm2w|FMkWf~oq>#DWt z@6o9dYPcxn*bSrs_$ryV&E~QX@E5*H=9AeJUksXTGH;~Qrk&s~;*Cz4gN)I{$HQ$_ z=?iyAnMdCaONDo%)qmYrSYGIvgDP6q2Gga3(d03TKWp4rG!uN-II31dv$kbho@J!y zO6R>sD}#}38X4Eru`^!YFRZqFHQ~rrK|Co8MYb*sr-b3uFr0=k6^@V!M@WX*Ae>C6 z9ShBm&_Fm5l#&O9=K8@n-FhpX%`_s&a6suHII~oOAB3S;7=H^3!_UcZAXUVOV96LG zfkY9b0HcV}7};VWNEL%*F-Q~xqZrheeu_n@h?g{#rdZN68aCrOE?@5HGJ8Px~za;k62@&mep>Vvq0>VvqG>Vx-{{(8|cZ%2Dpx%j3PGjO541O*YisI@g`he%W-tQ z<9FW;@U49}Y0%hKV;hZa+qP|dVxzHb+qP}zo20STIH$k!=D|8=t$8!^7tE~L``V`< zr#1&zboz&bY89-ZO-lRq_y6ol372nW+#J%194Nwg&ggM!X9^rR!gT7wgz49!7*8=T z4t_&z&H_I%@$xoj7}^4a>3@y=M05*}8&Q8@4C84e!MoGGpp@m?8Tz}kYkkpMT1n(#BdP zytrZn#d*l5-Gp^>$UGbGQlRKK_CEhm=h>r(UH}vc;7~sm2?nxo@MiO$4QUrmv3qLb zh+Jd|9u&LSdBCsJWg7nsd#?JzT|XopOwE=IZXGlUf+#docNWfmY~%^?N#d%Em7ahQ zUs!Dwe&+TQpq%|G*)s4l9KEMSIjxe&>gxnUmz``)64INnTi*{QvowCw#(Wm21$|^)ST9LG$PLpFf~fEi^FbYAurKImeJ1;=UiT-Gj#vKBiQ#wDH#SF+LC zQ*=$wVfOjB11%w~y;*&m4+v5lg35OYyTJDrV@%ZR{qILD?yfHG54w?yI2;6>pTED( z1*zGdVk6rHRbPHt`_Pxvu4Y<2h;?(8WF+avl(<^UaQZdzmMr)+v6Nsu&tIiEeOTDb zn7&&8GM;|H=3WLqs_yps*6#W>&DQX?dycGoZD8fGSApGTrrP*00MhaZzftf=yTQJ303qK< zfD~^mKrH!?q zN792?hk^$phnfdIhd?t9dw}I1m1Lk1#5v#$k|sWPFTeTc!ybUtVZaMR9U#v_v-8I# zSzV0OnVk$i9xNYw*=rH!$*}YKl!3~H4V342p8B4vcat77MS__w?rcH;OLA`!F=ec1 zqKhfM@_0AaK_5|djvnti{jZxC>u7;#?Y|t51_j8h%khKh_HkKaWI5I_GmpndNiLgp4C8`dz&HG{?}+d zuszz(1kZY)x4pLzLVth|%@5j7;~Du`5j46t8j|aui{=O8r}d2e+;-D=^8<9ecO0Vc zFAviT-Anq;>?8Gz{;UdGys;jr9khq;{n1PI{^Qve z=VE?>y^Dev`t>nBVcu0i|8ns#KOx^`LH7N-7@r95x}fX+T>$g*+q*D`u%92}pHN;I zl-tjb`3dnZ4bt!L#rTAO*9PtO_r`TWeG$EjKg$mQpd*EAK-kyMcll@ifv?an zl6U=QUl8KSEQXLZ{9jc1pvjQ8!GgH?WQSx2HXRb4|6+e221ETo47Cmk>k|$M>o z)#6`0&}sc&$6k;;${rXz+8ziz>dz<|4^%kU%5<-2F@MYdt>7bXDp7o*h4S+S^7AK% zO()7t5K%ynNFm`|0mHm(9o zdiVDnMZb*qpg(016NO-z{;M8@ZbCTDH*JHa8-#0ud9*-p;+w#g{rdXFy&;MbhQvw>WK1s{TU%T8a>FJCC;}QcTKfqvQ%|;BqkwBtM2Z=M1N*Ez2ktLcW zzy-@>$snQ8P`6lBs#Vgf!P3?k(Jed^S!gOsH&<_7E^e%>Y_HgE+n&Ew`_6r}@1~9) z{-ou<+WMz`xNbl8ogKgbdVW&;Z`i6uXlKNtfekt0@d2=nCVl2#X!XpA931-2>W^jRbJo{?e`i2NHd*rqB*tPfBg+!md!qQkzJ0iBK zR%t5N%K=CXsb@6m^wrE^%;Q;%P5F-7XT>lO%@jxu^?|cyD?3-{W?=?~E1@j#jqLkB z8-;h_8-<~QHF0wcn5>OwdOV0FskGm?(OjI-`#qop#oe32wiqHFhZ6p5sc9%LiM)oe zO{=nf_k}L}g^F|EmU0pKc>6Dg!qbmDOJi@)d=GeX8r0-NE0D-*^o7>iow@yKBAB$e zjV&8F29rxyh0ks&%#3_~s-xqALiZw`>u{hmkru7)DvE+0A!3rrsK2E1M;PLtr;C7c z|3XO0(P)A%$*>%{?H^A%LBFEV*ET}Ko;gPWI{J_D&nPDiKMTo&s7KO&$WRG)T@#jh zmPH_>@+|h@FrA+bFi}0+T3)Qtv;HUSq1bppvH2IcA z9we=?d7NQ?80`F^D9OsJ1CCj^2L& zRKzXY>e32Vu*^w2!4UVcK)7Y9p~ZzND*+fmk;Sl-hMC3fUL$=o(|Ti%QxFrz^j(Q* z!|ZM_Z)v7r8o;hN_^96QVmuY?waKuy?XdZtZ@PU8{loTt-)Y^squIO@(V6z-K1Fp= zmfu{5CH4uD&~4A^HphA>ZUSOsoJS<)S+bURe!Z7-!}vWofCb=bwdael|FuDUCD${c%AsC!LpkWswuBWX%o`X)4U*|@!L@3=n>+`Z>#hS zi{TkGRgPK0ZxjA3CScUDZ}|+C|4uB5y5{oIcxi+ zxLjH z85P?i*--K{hp|144ZVfJLT}uBJmK~*wY!fXq8_q2XBf@{(Ev|{p4eE)LzT@g?+c|jVY;`Z5olq?;k)!Y!p|rszm)uKjafH^O%v=ZqOl(Eh4JwoOFw*2 zIU?fa3;MCWKh)1%qko7VOJbgZ@I~bF75^woOc&iiOrpF2C;g8`a8HqcZ%%_Ig3s4Q zUQ#xAet@&W$I1SJL)J|tKKnb)^MS2!RzkjkYGIq9Hp`V&0oOjtg+mmj9$HzU@SX9<%9wY)<8!*& z$ES)R9sc%HMB7EPihF`sq)`Q;#0ZC(h*va#75oP2ZwV;#H#b0o)Rigk&+sEjA~9M=8>_aWtL+(+j!yG!kcS0Te^9V z=bdAH)vpYJ9}bR$NF0?n+e2g zw4q1I1FzX760po=F^0Z*=!WF%m_xu59n#+=O!*@e(NM8&4@oMBb4FN$Sq8{&W)THC zM0W)SI@o_RUNio#yJl^bFSQIXw>Y`}U1`j^;%*sjULJTH-uSDrT~h#O0-7V-YV<&Z z?{~+RIh_H7)fxxPJly@C(f1Z+(LG{6bapeCfDMwlb3iCI3$>P{ESM2X8mgG|Wk)f~8Y_qb_+GW$&9?@FW4vQNYw^#56^80=c1+8b(2M^YQ zQ>WV}2R`!sg54m_KNY7=zK;%ai+T?ovdd`?S%(eD2XB=x_FRm{2(`zbTpQVSiR=c- z>Md^R0;qJ!`YJa2ii^Fc=-A4on$u^DOZWYzCr-7K*RV6B)Fm3QJ7U!}IC7xNdcbSb z2W2rhiuM@Qwu7P?V!=}X+ANko!z}Je36!eAN@sD(0rPq$7vkXxmwGbw81GSkZw_w% zx^pf0nK+iGw-Jp33OA%K<%@38l#V|wn$qdj_`>2P*b_XC1R_JH{Z*U0=Z5@~eBXd?1CtwdEUh%9;KVH0zA zYDTq$j9<=uYfNYlnD9oqjiw^un)yf)02Pb13uT$oPUG5K_i71uE?xw`m&9K`Db@{n zUW~87Z|6~-n|*^K|xu-xZ?P{jS95RxMSGI2f25OBlu{w<#TDw`NH0( zqV?vls|1N;q-6i3=Ol|H0fI>WACl&pj10ZQhsX@RK3}))bXj`2(py3&f1e790DS&? z=blDUrRlj-MO@|}&zTe-^S5vt)f-Ba zW9!Z6^X1{^hK;@)h5@fK_)ZnHzh!b4YPuc*!ww3zMqhI=Bvvdrs=QSP48zjY5xW(B zT@@{RY|Y8;m!seqdGt`OLX0F;>KifK2vWlDE^@2&*Cp1t>$%P|Up{*Yn@N0G27 zT~`i=4AZI~cU7t=!LDw3Dh-igk=^kOH{F7jz-+|xV>}36z4*9yco?%{war+NC1N2cVAU3pb5IjH} z3M>o~EDQ=v9`1WA-1i(jXdX5s53@b!*lH5{S%iJ>uv?$%I?a?`+)stQu%PGhjqHr_ zz3e$6znSdgYH7*ADi17%*W;HcsM`ez`E`+Ww{+Uo0F-ygUN)zlL~?Vo#2-r>^&-5% z&daR|}p2O+BPk=HZ22bkH#r_ypg+$6g9mJN=%>~ydGix8%BB&vi!=e;S-VY z9fJB}%sk?^;MSg8!~lj+(!OO|sB^^=i{9d`J2XEqKRiEKpKL5Xwo7`!kN1yhbxiGD z({v2!T~mK-`qZ@m#+^YAqabjud7 z%T@@oYP-vpQRnh}EtXK{t0+LuT)4Je{%*Y3nJx$&k7y64O}o%DUpUXX5Q z>21QZ1KF=GKDx90g1nevEJO zB8zCpStRND)=_tPVN0IBOUXAU)F!7^3w~j)DWY$cI;ekj1U~u7KF|o^GjTw+o8sVv zOp?)#Gh3|3Is)u`p`=GfK1Na@v~E~~Gn~R5KXjo|Ybb;(nKbqNeYzn_9qAWh$o)R8 zSUhs44bsa2y-$5OEkU%FGym4n5k;;_)8|axWm>6vFEgA<=i#?UG80#DP1~Q9$PF7( zY9uDj_~vJn7^etl-cZ(>gAFrerk1ICaMduG4PE>;6Hc|gB|iMbhRSK)AF?7igC(qg zUsq8z3D}3*SM?=}SZyYpYkMQdunm>-yg%SY%tB>>h^t3+R8BIRNS9gwJ09+9;?5x8 z2eh8gJN=5rr&(c?V6ploe-50M;m|P0*$kFS4N7U@Q1ZcqzrYvewZgD?MXD6N=9HxY2FALnxr5v6{X~~=G@N( z3`+2S_6GtZ2F%K7XAQhnhetiG^wTqu*%3X)-_N~9v|W8*9pfz^%r!{ize4BVySRSz zUWwQ21cLcuU$&tOcE`AN;hCS)D3r9aFz7@izuvbA=!Z0WLDA2vvta5B>NwERFRwBo z`XHyCpQppx^|8H*ZRPa_Yd^}a72BH;v_bp@&T995`qDV}+dlJw2v0X}VSS;x2U9B~ zsV_%tD-N}Ly%AA^|0C$!bcn5SEQ$3Scl6?R=^?(vz68z?0l^n7K!y#H?XfV^}{QLn{6-1PxRzc8BC z+8c)P!E<>dyj2KSc2;hLUWgZWB)qBv+Wy724Ffaja%^+Ki| z2%K29h!dNn8OQlBg^uGj{B~!k`11$??h^9T2MKnAGSRihIXk!z_vF~ zj<(O)nEGv;noxEpnCYDorPlW}qbSiusrQ)Zlo>S$TMA-AZa=qa@D71LSC8)L{%Jgg`iRq;r%e(hp=%Z-iPxLvbxtQqx|<7{t7K0Y+Z=S%Bw#p!(Y(sS?Ed)yg@Im_pX z(+Af@b7K!6lC_S2gDi}^iDrNR5$j^Behq7D+KjR)%N=ZlP^%1Z+i?XRT;ejkU?WdT zoJgpI`Zj43m=Q#QrV=_VYXq_e5OVZI^J?^EK=!wQWiK?bfis zaR{*4j7OTY6_~E-d=u%ac5*B@G8C|K%)3Qg(aN{#e$C-CmmE4yVridkl2SS0Is*dbbBt7Hyk zJcUux431PtEH3{+>|CyY$r&|k4lEYEx=gKOxk@&zQMp<}NFO=vkJN+Z4V3{4MB;3S zD|j{mye;il0vGF*)4Wr(Zd{v%*SK<)f;RBJH>cQi8sR_sb&J|e^*W|U;) z98c7n3u;tMjM8ehVue|%D1M-z6B9PDrX;4sox^%MaCU}o`qbf{(Q9{mWoPRmA5vTYxmm3mjk@! z!zYtAGO!SA>sv+yNJT#jCs~X({bQ^y$r+sD3t1b}xtoen=nyo;YKxd_`jR8*^VGtG zxF4(-0@+*57*-CLi>oS6oa;5u6pINk%SLU^ewH}H$6FiXfIDgv$b0&B@9#vGMHZ)F z3fritE1z z$hvwdNLHj6+b!fhtSK8ficgW3Ms}Aed3+Ug`@@gn)Uh1U4aQRj0T#}G6GD&jx=jdc zRHW@Ll96p%*4N~bz0GiqsQ>M`pr9W{xRuz|Qlbfdax6?L@sfh;+YTm>y&{ z=bKOysEPz?rnBRi|OLkJ7aoy`Tgx!BZj?e2-sYDnRK%~=SFe_(g+2DwtI-Y6)O_V5+G_AqR5LNO+nC3DE5Lj{UN zj*YE=A=9QSJ*u_t_vS|Oz*wjTBa&eWA`OX!G-D-eaAE#(`AT(u8%ts*eM%&h@Z>=J zZ&k5L?Ys#O7_{<4{}88muF^H_iirhYYucyKiddK2>xU{R7ho1O_XF$BFl6L-^W7Dk z=N(q&Mm0%>p-C=pPJJQ5NI!o$LTPvGcCnMO9aWid70z$^*v6Z4Mw~NGyvlP-CWab% zXpV$GKh29Zn*{bNpF=Gv71@R4I0M=oe8iZ4Iy5HS67>^$O zm=%McNMqww@W(M{pN)Ywi^S$$6P$D8s(wNGCjP~#uhyFmqt58lGM}%Pvc|p*Vk5q} zclxFALacG6@n&Yr(d;tEgXJcFp=sW#Q?=xM)KxS5$t8{NHV_krtgT^GxxK)2eqwh+;5E~^L2X3eT;dR$%Zqa8ei!$dMg5^yGeNF zJpcSRlcmfBcI9j|Z_L-7Ba%||O-hDVF+ruTU-O{LXY$OV-;bm^edg3ygXL~1qoQkM5bGiEcxWngcU; zh#j2wr3IE`+T5d}iE$eD=$;315HJ1cd}`=vE0fagXa|H`mrXL+pkUG4>?BdStEJ31 zoPHm_l9M?OzFMLYr8%=np5y$qIh}Ua1)pF9B~Eb8PF%OT-G5QDTE4aI3*&$`FODw% z4bYsVMf3|cB@t!VF_jy&b0&Yvz})8&8-6?zZR@WZjyZDL5|Q7v*Ne=Yezf4oya{iI zh|BoKW7o2mhCS#g_EC96-({v3&(x`invE&)*Lq-^xVB3D?jCZ3w8f3 z%ar|X$tT)%T9Ij*Vu)E@GWI3rBb zWuAE_q+;byA-+eYV&YF`o=lKbi_J2JPaI#NOgD;2ELST}(ndAyU=uad;45!3n~*sd zN;jQOrM9luF<2hAu`ZsfR~rYju2#{OZJ67jjjGDiF=-w%s#LYA3SQFkHi>9f2U4{3 z6HHfRmF&04X{xyojn1tX4Db_{S2+GCoujVrA+KMIC(qjQpMMKra(0Qx99)$Qu>rT2Mp^>dOS~a)A0pa}jW8(-buTnEk0pe6dX zlp63Gmr3TSP{2;Cd@GQ;9X)mI8|(OGn@&%3<)Pfg@6I`LcjHzc@Kq`99?Gyf{i}ZU zL+Gm%dk}%=?>F7u%jqeG7JwtwGCL(}2vb%(|7G~)`O_Esdn3I55sc!$3T0>yC6wIz z9Tra!m#085EaDk${Zy~j!m%^%Dz$|zXX~TvZp+iZUbnBgj%T22XZ%Y*G91M(CSU*ninX6noE0s{Kd?$< zyJnMO<$+bifVieY%LQ)A#)a_R;r-Q6RNmK$N@U%fNh+&Ds_3M}rHMtXS-%FJC>YP! z^Xnm9?CE{}h}z=JKTGla3$%Wh+Pr3*!bl8AeNn8F(mKv_G4;N3(XPeAYaAWM7Xd=& zKeo7c2mPtXs2{R`p4<^780rT!6IEA`-z+j*JzI)s%*Vh>N#F3R2!xzf(%kdX*3d&+ zMy~2u7b*aK(6+iI{Eo4YnekC>c2}u*`To26C>~1jP(nY=^m;=dH+2!4{03G6n*!ER zY`-vTe7{tS+d5*D@{eH87XrZw^7d9rTRNQ!7I}taaSoBb=gXj=l>@W^HzP3O_ zZ}8;~_4!X}8U_D>`m41Dv3;KAj+lmDOn6sRTUQwFAxE3y&S>@Bx57L3UzA@_-hYI7 zC<#H_cT8M=zS_RrJAHbJ>b!Cp6 zcnqvPbZyuIDyqnCPmlMFHN!I<7~GY;A-4Rv0X%0{w09PL@u7RJB$)O%o*tW&ecmHj zJ_gal0IukBw_+qe7OKQ<2&&x8WkHClR$AU-An+=g)r6P4`J-RG|Mj7KCq3`4=!oUV zzuW-%1MFks1I>5d{LWR(5fzUZr)cI9!z|FC$DlkAd3*y7HNt8tFs84}3p02g3s0r>fnS&cyd#Rwvj*J0%*|!&dyu&#Z?uDEg)W9aj%6923Qu z;TsPq4z`YNpC?&oNl?1mNqm;$uN=%k%upu}V!DI=kbf-fh5*;*WQKiP2PpH zY{pglZ+m&se(b*rrC&Z_{xVj(A}s0*2WRMe7M5QNrk_vbMCrFd6?Z^}I$}FTi}`g= z36u4D&^_ww`fz;jb-7+Jvm~gpl?TyTy{V5PyNhctsaakqO#A&b-Rtmym%x5VH6@PFmhxF z6^#T4j6~TfJCCyEI|UWAp-31}0f7RGYDI}~%Ca&Y%jBNs4XbJm?c!!N>Fa95E8ytO zt#RFE?yVEzD3hg@<(T)FmZI15i4r-+@E$8h^9r8c?(X?L;7<-f{(k@c%-OWkvaHtr z2FfYwJ*Q)t!y_}&iZ@2kK2b7yzKmdI>JBoMZ7I|pMhv_#HcsEZJ*c(C%e4?Q(U$~a=8kng zt8k~WVuEX80_zbNsN3opP9sH@F>In7a*q==VmeAWB@6~8 zU_V~-@C>4AKsu%+p@^3|0eFuooeOwNm(Jf=ok;)PTe`cyprm;EQ4g47 zPwc{inbiU258^kba($AE@AOIW>)B8g(*-b+6E z-8CH%1$T3Cg#aw@VJ$S-kAV_@E?dswq`dqV(qH2~h~1?w5l5`c52A2>cUsj!cuvXu z>_v5y(k_IDrCL%qIa^V!C9hL*G$S#Gn|46t{H#lw*A<#V(EhXn$KH5ub&sPwW&UuV zOP&Z&IDK3qPLo{03Bpdd3^0YCc5Swd>b8Xb<+`)cl-#q|(6mr_gr=HAo2917TG>Qx zE17Lx9+V=|t~o}YoX8MG!tj#iLPwV*=e^x3s--PJzRYdOwERHM&nBS3=Bg*3m{?OP zxZs?Z)|0JN|3S=4l7dzcR9{3bG3}UV8j=WPEr}~N!*Ib7p>Urmc8$Tu0Js5A;iC#KWysG(_v=u%^j*B`wX|evK4e#ibvYV2l>$`S^ z=8+{ej264*MN#T0`b%_AWER?k@{ z!$&E{Ws3a8BGHabhs8XTKK&Szf+s!(+cWLqC)%6B{1W40IC)5mNm*N6UpFK}>TuKg z(8BX9M`;=%110myOG;+xy5RlLQgn}~3nuLuG^PFtP3AfyTWNhmr1@)`teMKvLQf|w zdQTo9eOu&0Eq_xG_?EdXGIa_9PRD+A*Aazm$~WHq^wexxNx`5o)gAZW5d#- zt){)6Ms-(6dEGtlZ1Iy?-qYOS@tfVa*R#1_Vkjw220dbqw4-ltVYt!w#Vuz1-JObUg~(Dj`x_ux5`x z&UsE^FMJIq$#l%Aa4eqW=!xMJ{j=uS(#F3_*?ZEggX!y8wtJcec7uAagKwlf>&( z>44YXGf+1DTwNNRQ2V# zEtP}pqssdQhZ8_dxZMUR@ed{uc@)EgPS1LUczUtdp+rTTx-W{`Q?Xy&1q~y%JlI== zX=mbto0J1#{*dP->md^S<#*lxl)oWxiwx?1;BnZOK4g6(*`PGWMZhb{mtRanz?nUr zz=%veptVja!Y>Jo2p!`c|kAr`BJ65yhn8j2JYFapUu+hi0pQIRz>f%oSkR=zBQPWI3mtAqX8c?H> zWyjpD6#VP@Kug&Lw$O`XzpgX3mULG{b4oo82ocvp9N?i{N9+Tu+=dm^fFc&Y&Hm-`KI&e$b73pjt+5XP) zb>wQDe&dqZJQ3Z9x01Tk0v|eSp6-{y0HS5r}JmwLqOL7!{;& za+_pFiiLY8(@LFkSIi|j%;qq#F}XA|cd#iOAxM7O{|0yNK(Xp^3JyYg`q?&M_z$zpnvqk8=S5&GZb{wkuk<9k<$$;Efi2|$ zu@3;~ZHgWm1Nnr8q*PQ$FIojDU14_(sLfpwUa?7`%m9ALGxTGM?~C7AB5F(PBTm&x zObzX0alC;ExC9Di!tsU(X7D<#e+?ZwtO0&2H9PDHLIS^qWQtPqY%hYh4|tp0Jkl$+ zsld5sTBiSD`1si%xi7E7FXedKN{$` zMcwj%yxDa)C|wJ}8F(UxTKN;({QEe5n_A*+HJ!<+-if`Umu_ zV`(k1<3suXT)+>?njswW+v*=3P$}n%n>Ci6TFa&-7r0I|by2d4TnjZe)WSQK7+uS$ zXPh9`=h1&h)?~j5vYRtgkTrNn3Hlf}BsDxX;-}%Sxi@f=%?6=Jj>0NzgLHv8d2amN zGUK_P%&Tc+TbF{}qHUMXhX|d@%{mqOl|@;>2Z z;BuO>Vvp?daL-t`(1LnKNRix3&qUb6=Yo5t#Fb`fbSz`JcVL*{-ZWZS%gIDH-L;Pl zzgb=o?rYHDq?uAvORJ_0E@$6tQ#~=l3<&YT=_6M_p~+)qkEb^X0mh;zjK4^lcFE0? z@nuHEJgidgR3`i1#JF3s@kOEL>kTtTsHLiixKw(WBy?rfL_Rc`;0?(n+DjGbGZCm2 zIyOdVc6lRArPZnZMybw4z1(rhe{(c1zR{)m#q+I+fip3|qn=DG`LG@FH?d<>Mi|NX znAprVo0Mh$Z{yfom*h@W4DmC&(M)2zdz&T$xn$rdcza1D!H9)j7 ze4CkeQ<;p8CZk7}o;kbQ0H07W)+|HcV;=l&LY$}d-DH8z%`Y+Hzs(Zp>7k%6{+0vH zmVGEic!#cYs${l#2@L-O2uA|4df6?mx1Un2;pde$WVp4Hs~M!1w*->T+M@$S#Wc)m zfjxrJ$1n-sfe7e8yYGS=ieR1TIu{r?Gd=Q!>o_ljZfE-PI1^5;jQOk&ku>MptS&Lh z`ry47#rcnIZ)z46;H)m(c8h~*j<9tSJO@?Wjj9XjHe{Lp>8A;diJ;b*3Gwvxey<;q zgY*93hm2m#Ilr@f5FC7B^)dwcaUqj9NOYpRzJD zPKF!wa&d*SqT2o~8+M2r_tqDmZM=Z^P+MsW7nmNpadq)B!eX@>n%yN%v3BRkzS^qW z+2xFqV(VP?p9w4Dk4=pN^y2!IlbMCXEH&H=d>~wRqhPFkh0>N-79PC@VY41`(cDI1 zE$3MHZb-|5(L3qN7|MdiJJPLA%`2QY$mxz~Vw~Lz4EYe-Ee)Z;{1lp7h@t-Y--1314{!!OYx3cM6*#;3IznL>(_y(PsU??*UZFA$!WG54Cx7T(T{J zGNT41>^~-{tdlxSWYVAh1ra{Hit-Dwz*T+#m84cd&gzH~hOA~S$>!Ty_QFhP^Y6)J z`y=|ZKWFL^dJiM4Xjy&T5u4yLnD2BcYoU zvq4=EAF*&x-fj1td#AiOW1s&~coRm<6C$ng`CI3fpgjGY@fAsJ?De0O^*}_=1-iu# z_zu_1GNUOdB&=oCa?JQlUU0LCP}(g#EfQxIOV%$Z!jI}RyT$k6*ye-XoLBjrKKSQ{ zFq*b4Y%OZ@x{YT;HZ+OpO0BN;c*0) zg|G zEZL&WPMbH%O!O*YOmDR`RbFdk9XfR{FTfzo!$3Dq36TVbQ;zwD0IAolsD;}0 zPd+$!5(bn~m3PJBhR}is2%O^Pdbp($y8S%fbD`>qt(t73THJiBB$=hoPb>1PBv=#@ z=hpCRQKP0ABhUC|INH^R;9^pg$zeO;5%KtQcGcXPx|VQ5wJo%uK~ibErB=~@9%=N? ze6nt5aG-Y*@`X+4UkF+zfao^7(!S)nxn1udW_K0q=@(6MXYIyo@#MhMPQk9NFe8Qo z`6eUDFu}OStqT|Q!P-Q%z^IX_B=9i5ZI?O(4_{xMl2gdOg_6oAKrt)-%e zLEMKU$2HJ!OjgHqN&7dATRek!GU)@B&Zf4C`Nj;xZj5Y7Ut@%(OE0!7S*3KOelW1}3DR6-P0GAhq_JEZah28`^_Z`9(f>luv z_nWNJ9FBl8T9cBl{l{680Y`C1T%GiBb7R4GwXKnoJignYbV3qovsfHqxZ`7U{dhF}8Yzjgk?G~2Qb)p!_-*mqY6A8NV0z+Hii6jA~q z{N4bUOV%%liWhj3lhu1Aa#VNaBg_GTSMdutF@Ox}tuw8!2QB2nnkm_rM50Zx> z-956sE3PecG)mORUt09$i2DUhtFZ~8)v|c_fGx#kGV_!EzN%UbLM(=<_@Z<_Bm*SvqyLJ z1@UpmCu}E|zXC&8!|DLA6VG_*#P5X~*x zP_Nk*?JZhy>yKr2fn+&C&or<`A%+tdp$Lqi8a3TkNpR#~rjJMu*k&QGj~o+^{-SY; zsU6lpO)s~Myfw>e8@ph*n+`AvOs9pJQc<+fBO*`7Hi}HAp=Y`uQfU-G%S;?{X_S~^ zWI#1NLUBxQ*PCMI2wy+aHH!7@ZQI(Ss+j8DhjH$0oAA+@V#!5O&kP%48%rtH&nGZ@ z(f|MIq2RwWcvC?B_n+)PO%!|Ttv@VrYA!h}7Lao8jH-$?k}JDdLT8ytj3y=A4&7Z; zEczV|Gd@8HCnFGr77WHFv3Nbf#)=*SkKq^BjE8%cB2<_Eo`&O15Q`4EpMi+DxZ{Jo zQm*riTPAzA?B;f(`R;wrt~clG6R4Me8)_~D89q}yX3Ig0qxzyO2UMFQ>l)Ro!Idnf z4Xj@&aM_7Wr$&Dqcrn)=FJL3G!s8xkuvr|UoO;OX5Kdw@(Js#Mg#7{4WAU2vQm)P^ zG)S(N@zq%06v;?WSt&JGE1P`;95RR~?GWhO^Zk zoW5LVTGQ-2(jy&2!&Z}T>ey*jM!@701SB#gH8+QKmx-vN>uA{Zs{Hg+tS(WvD#O8? z98_B&w$#?hTQx5CIMt`TeHtNP^{$7Jm9B%dPOom7YKE-6TzAvk!ARL59ELP(kH?ma z!^Yl@l+Qpo#Wp+>&1AMTM>_Bl6OQrmeb`US*I{c4At^A~mfXfUjXh#6VIxl50U~6L z3^9cbn~iZ&QZ_8hlCNH6NU+sE-DZyLnOKZw={$5U+LMt>X0;(5w^MSA-d&w=lc~|w z71FQLqE8I?*h-*RU<22k@#n*0inc5<-J<@;JCzotnRL$fS}@ngd&t-}c2!e`4h|NI z(TdMbjV;-b+QxVwE$n4xoXZ}E0g0hdZ`~*TeEkmo#Sx~?i>Nl-S<&=1T1@DF{VU9a zw@2EeKjZm~gHabwd+(n*;{I+7Aoyou7#m}p*QeA#0b zroven9F5VSYe?szPU$kJK+y$TPFN1V0S- z8eoGQUB25kraUg6zkyC!?*TeIS3MXIx5NhNMw8WLH)`NcWu|NnT!*Woa543|g48RL zyFJiM6UxaPva~yAw*-T**di54@M}Kt+4fgd`nWL7#Mbvk)&n1>;v*XZI>F?bH+X}6 zBE2t%#V!uCt#Z4s)wf!s|L&0Mf3Q_0bgKXAj8Z)Kt~Pe+WZvNeQvs+6y}(*f(G+M^ z`f#aqvnOLU3x#*=Y0q|my`{(TZQ%D=1;0EIoulN7z!MK06#hVN(fq2{MD?3>t+K8d zovviRjrNf>$n4b{Tz%4xyI*O1_5drsCC&0ck>mN{^6S>6o+f~#$|I?re}a}j>c7xB z^wBc)Q7V3lU-vwKULOE0=gixS>Sp7~-LkSytq{GUDd0|}RT;E$me*{=qI^ni6=K*T z6kUyEPJ?BWjJ$E%Xh_l}j%$dXhMTYV)5gjLv#z=;+^ACPRN*^bS^{>0axhU%n8x-?+Uemr_cM*&cPV!`l_EYfr)A zFreBYY44hn)@P&_f%Anh>$%hAHXRD8V-lr1Aki%u>xK{HHO9bOg!LumiB|~~^ys(= z9?pqJ;2Kr=ehJ{}UfZU?C|tn>eL{~~4g}%q3-Oght4fufor9K*bjK{DTa>43K-aBL zpf`6#MGJw$_|iLNnsEAl4Sx2~wQQ3!cHQoT>l1pI-uI|NvqCu4icd3Xy8sk5HeWS5 zn~TZilDQp=J@LrSv$$R7PWI0`-ui|Ybr)^@rRwo;Wv%juXksSk#I?{t{@_ zhj6|6V?p+72(`GtBI)c9Hi(|e974Kmx;lAJhPo5SMXK!g*G}wfeAz=x*#r9Ho$Xp? zViwOg$bafe4UG^(_>Zm#q5t~D_`kZ6Nd zU$~PqQ!}sTrjX*M*tfGdkDqm>uHUClZNEQXm=QAz5HNA|W;Q!2F^lSRR$t~b?g#(? zXw_D$)Ttfy*1ak@?5JH$7i>ncb+iUj>zaa8#{lG4u+E((#f;fqGKPH8N&Ak&(IaGf zOpnqNS*yQJ1)~F&ZQQo6%<~aUvL;a}MTZtu2B}*YlMzi2#9X5R1_@l2DZ$(m6j`U~ zS2>jnt8!3lLlnDH*zoztt&kd6h6w=eJ*xa$8MgHMd)C9XU{3ai*x1xYVek2fwIru? zL4gQ$G#kqx|Er$vz|ur#F&#^EMk(&0jM7#Wtz(bIy!CxUhjxRuHr{d|zu748Ck$&e z0~rmKc3-ezCT#l*&s2wnI3vYrwPOrt=$ue0SZE;zu1><5p&Lod)dg!2odrOq5ZuPL zmDn+s@AiphQ;4M*)4)9}tDX?#1$chtoIgwfkDRK0>!Nu;ewj78iAW=3nUQ9JDcuHWa9R<&`br*4gA(h23Ya2sMunZ2 zOZgTnRhG%sVk2_POjR|?12n)C#6>^;#&jZ(d6O_nXTh}50*aL{CUoG3dtr(cKgPvI zA+dfRxfeOK?o^xMX{#P-Y)DJqoCG*{Z3=iH&M!2~c4bxR88XN?%J zyqkz~X_LSnRlj)Lmf>EcB4*z(^^21+s+rK$bfynkGJx8m)l6ohkB}S=VkO?OLN>xqg-yx=D9Q)@z*-xgr-xjuzX-Kv%An zK(5}?ow2?v{~TjPEA3|@Y#BHU0hXi>P;=!`RN)6+PR*9A>) z$jqVXIzA~DgiXBvcK6TPvYfSv^|U24PjTpuE|tgASvkNHU4e!I*b?{q>e{kj80pZI zxYa&$S#h0btaPAVD0z%P3d7jgY%fO3;vMv$SmXCp*a=a-x-MC zcx5lEwY!N?pg2hir!ufp;Ykn0z+buM-Z)|A@V7aYVp0vQA_qEu7yKo52C2@`bF~c*YQ@#$cr1NyN|imgKDWEs>vZ zMG>Jw+}FNRO=PD(N)RtU!k;&q-Ia3b+j?X)B?KE8Lk3{xU4!LxM|EHyYZc`pHBstV zr`5X4?GF6iSNm%K^nif3jG$=1W=W8zwC+;)!OfoUXz;bA`H$B#5)cTzARiEl`3~7u zslq_N1Ih1OyuqN9kjq{&fOq{`3}s8`7DQ~#PIlolnz%{V22>H;=g`E|AANNJCzx3-~m~uB7%YCm}>F- z@dEU@%HKL&ehU=%#vssm>a*0`xCT=B^&EKt*f+cfJeVlEH}j%XElmR9W4}V+o>H?3 zq?G|tae=zm6^z1?FJN#2xkNJ9<_ zsa{JCb9wyuzkVHvC&xzoUrMCO6CMrF=mn*(vN-!ap%d4+ipP6%$cBE0p z2entd_@tUKI}C}8UTlU+^tf=LRWL4D(exCn=m}Xxaclu7Z>&7EEwbb=@7kqEWE*h% zXVw)$D5AP+YkNry+4`~BwE=v!qCi#eyeZ1$hy0ZOVE0jEu+g(PAXg+to>Y%Nd18jZ zGD(5Z&^UjeBI>7~;|&E65}i_zm}6q~Yx>1`(8m-ydjMmTuDG~`1!<$jQDf=>*O!+e z81lmoe!zkW%Uu8irxBJoMQ*EUTx<>@jSfOBIK|<#D}))_p+-XyibZBoH|{l*_*;fV z_{nk>8pK*KYyI`qh=`Sy$UNdCS8fDTma_(CX^;sfO^}3HO|J8kuQmYuoy3EEdjN09 zL1SZjB7;fl_tQkf5P#t3FkcT2(BkdG zV!QvB^dw;&&EPEJTU#TWRvidx4%aZV4w>&zgn+W-|Lel8*JUM?fzZ^=lI?zlKuC28 za$>$OV7fSQfu;Z;)baq!f<$|Ix(fGL(=xiegjU+4J|_j1I^_?~c?(k@oCG!sexe*Ey^_5|YGiv83wfJqigIJ`XLkc`o*PGhN#l}m z+c5J(IOE{)f-o49P(~Ub9ihBXLbHO=wBz>bhikS+s#C6Z6OeHj16}9dB|zW^j9DP3 zl()xDrga6>8cJ5R?@D0gcI4_36^Ma%jkV!^y}2OnbMLlCxFJkik;*f4*{Zw$qz&=& zx6b|FcY)FlrSMuJAjlrzw3krs6!}i_nz2(W;A3S({hru3TPFNNb`jBeKsVp!q=6nB zDY}`?7_Z)ea+Sgu&lX;gz@r(=BufG;>ebycJg@H|RGso=fzl zvX4L-Gz1~s68La)pvdymWfAV2P)&7(dq8ycK{qPp@FAX z#I}GtX*z#{MhQ7&BCmqd(eBA*<;5$@=j32D4VsTEBt?dV#K}<_?s8I;oyE9DYJp3A zRctu;1=G=#GhhB1sceVd@*6JM?A9118n@uWg&lb`9t3)Z$D%mDtT%U3OAWJODM-+yI#D z=XHTX@}Nyue1OtKQOy3&Sh^&L*u2D;O^p`Ui}|$4AgS#ScW`^FFcMFVb#k<>me-pz zb3`7^1LSb8HcUNfqV2Acn9y<#z4?kAeG_x+UObt0j${BxMjish7G4dQlW&^UXN$ zHSb=JyHQ_t_m=)XbESA$cnUFfUI|#f%Ew^JNVj7@!m`Ski8vHU-QR1c^hJBQosIdr z%6a468OI`t|1N|pSBCC)^u+*#!}4_2E})_}k}*_-RA6zbZ)ISTac^m0e@UEc!Aj%u z_DmZJ=<4+o3ZCLL&YIuPUD4``clb&>sYlxnGAw{AFL67Ls*;qn`z<+YWW~lE^fJ38 z7e<9;#UpZV67AcLYu)l;Z2hYt^=voY+pI`$IY3*DB73c2Y(?pGZ_)uc3k5R!A@L)y zENJZUmr3yPm?6m`RsD&$leA1Qa#&ox!FqK!Y#o`TMGls8zA~6w>`$c99mobw4c}3L*B2LyQWW;%S`Jw$hh`Bihk=D5uVcZ_nI?B1i4*9>pX;kSWQ zjpU|^{9N!Fe2265>9t>A`J~@%YQc$&;-z!{J;4|2!3YPhb`{>?e1#>CRnvBWwZ8PB z2lH#;%1GC~Xek2RLyNNaaE-&0%`o@EB@V61BFJ-RrlOL*{$Q8@8xyDWUEdgI^-&w@ zQM@Lw5=XkY5yeU^4SU-&F< zK<1PrE)>m>a&-!%G#bXBDAS}7Y5@WzICL=CyBjoK*xLs9KOH)BFUZ|V@afqBZsC;3 zlAB>pquNx9HHPZm(KSp2rePdvh^z$Gbn3EcCcEfZi*jiuG2_x#28hUgeKRiQvue|H z{Tf2hdpj7>b=lpkJG+8;+o;^sn55vZ!c*kVL@_q2-6&t7ZorlDqATe!GE_%yUU@%8Hz&YGHKY-wYh))9rIp?!+d`-O{Q zg>n(!UQ~W-G_)XpMq3+Y3=}o&ROg`UA^%M)OKAWK3w-SyU44~eCpl#+uV> z$igjj(uK~@I}3ZkrSszwx$7luANimK5k1yZd zMKmXJzv(yng2JbL?30(#zhBm6=$hdl z$3or#R9tE2ZX)*Gx|AWp)P;-6H>0wx24T#M26>?eNhHhPAOYA$MkzI@1+7~t}uaeq^OFcW<$V)u) z+U9-4HvTMlC$trpy_-4X6JMD#B>9x6AXX~cVikxtF#ns1FpDPl5E9`IKM6&=loSET zN14eJdRT~fV$H51UgG2xi#PC!coMI*iX4kJ+=pf%&SptIRQ!9g$~zWmI7Z^7&(jfj z&_KMb56!}#)fIT?`}agNH*07CvY8C|Np^2aYEK_X)K*<&*o+}{5@}(vDWl4Idi7{j zfVqXIe#Hr7+{ml&1*z=Dgy*-I#j+3JSl|K12CaQXTycoNG(SJ#QtN^~?p3v?Iy)q` z@HY($ngLZofXjgylTXN9g#0@+^T_Lvt2TOZ9WTjGQ12yi_95|axn!U{Zh$$^?X-1s zCIOvPp9@9;L5K!_Q|mqSIJR2s->{J6?V1FB8g1PcIf{dlH>#3ih`m`42}>^^fKjN# zg>*sm;FiXR3@Xv2PQN|St|AAg?Bf6l;8Dd|)@u+;J23w&wa zlp_1_Vm`XZEydxa>`ppx9cj_C^MfCBE6ucW{ z2>xlov{Ce@A;u94doH*RQO`$)?Zoa{Ee@Q$E3FK4dqMNkx{Zz30<~{Z*Y^=N;1h}8 zZ$6uE6lNgXv_~iL#0&mpJk|2tg@@zH<>9@Z6J}uJy+wMYU}Wq>2f&{{n5lZq71}}0 z&BfEb5`8dGe%PU~%lB+Hp7Po?pm!AuHsm}u^h``QR~ws z2_jYnvZ}*7s}qvhRi_F3TY}Is9RfYBeDCG#bv_3g<(}o-ExRE}V0d1ZJMp_lpqhZy zO2H(V2#`uKazUyf1e8~hhc5{6*&t0sQy!^NFROFBay-yXwfKulj7aeLkaIA{c_L5= zZp2qdA|2$ejq=(NNyX4W8N<}YfVwBFq@v{D{Ut{tiac`jeLM(-V?g_4z-{gYhJ~z^ zqpE$H!-&EHTOHmV7Dd*edLB@`LDpiuU1b-Md=RmALHKY|0E9wYg+fc@WkZFU#EKx4 zk?Nn|@_^u9-xmvpL+0Gb$t!6BePAJiPTv<}(L<|hfmW~Zo_Y9``*r7_yk&6Bgtt$1nB^uV6>FyNM4eQwEZ z0LDj8hHdcY`QvpOY~vbng(v%9rL**Nwjyq`X7vK?PqUg#GP7d6GPH?DX$F=x>XVC? zgw%U44}wV%>n0~rDftRnYeT zR9P$t>S@UsGB}!hen)(n1NRbpz~DTYfPvT;QzCmpNo^4%bmRa@mnY3!61fCKwrrvb z3BBU`x$RX<>99{!iJ7s`b5r45RUga+3n3lxI=QBwzTdOsRt+MC>S&<^pn))Wf;IP@ zr6#1Q1VTHuh~LGrc1^SO(IGvhxP)@dyP%R;rNTQ_c!YA?yH3BS8h);c`q5HA-z(Ox z5rSX6c_2qJ;?!YaJTvH2EAc>Unq3uP#_7)rOu{MIKu6|Xx8NR5+dz(OvW#m6cLq=@Al*+LLAS);kQ!6JZ5I*feWA9D_c%-j`F^b_yM@>P)g+9!ja=P$HB5ds;u zA+fAf5hOPgj`I+7;*>)Ev_imi3VtMnLZGEF`#08rt3tTE>=u;IX?j~{Flo{{l`%4 z3|7Kn>%iEbTN}jc$CrJ3`871nFw)Uu-o{89B;#&0gV!r`u+m#;C9{)DWKOQ}$Pob8%vOKEdCT1mpZevVLn<1A*1p8DZ zRmm-Itxwzdjz08J>sxde2R>32m;ngb0dPf@)%~k$*a~@{P*jcVxnl3k8Ref~X${>% z=}&0dMV%n*X4ic_m);yD-oG-}LS`zxL8Hy_`)NII_mq>#sg z3{kP8Y`BGka-M$W?YA3pEyL|$**?)j%ePLa$G`XtLF_G(Av#Wv9{b7NIKl@mnGvDh%9Wo2_`u^H zYh&`F1MEGxWEPnTweS(JA81x8=AR_8VISX6%od7!;duerX^*FNT~~fCyy!0H?smC+ zAat{)ea3HAE5*}(<&W-mojz3?wTpYS3xf@l@~VY5 zVpPEbda~HBtiSWCgG4=8X_hQ=6!Z`Z-@w&#Z37*=kt>$ig%i8Lmd=lR#Wo?d9=L8! z;dYikYjh9<;=7PFAIRoxe$&kf+qL@enV)-f2nGS>SE;19<#uEndEFeheR`F$R?(9N z=>)s~ZFPgahiS>8Ht%VJbhFlEh11w{M{b8!96xyP%vGcK8u+PF_b5u`-0|t#KA4y! z2)QUYT??bF3U?#oyvZI!WL!S)1EKB~$M(IRG)qu3^kvyg$V8F??{xo8h3u$4lo95~ zthE8C*k7>Mz2YwNkfv`dP3~hp-_gLROYP87;phP-5@fV$pq#)7({VodNYDr^9lp=Bsto8sPGNZIex5A29Zh?xxLVX5VUF_qeuUm=B@B0=-5-b+`0n~_40WAqo}8EId}D~+J@qMBTOmB z53YY`&sFCK9)FNiF9)D6oj%7=Z_C?!{L-%Ahg?1z-r@Qre5u-k>t2ZNhw-5AD9Hx+ zCO?Yrs(g}kpgV{U8?@?vlw#9YpdUo84>{pEmoIk?ZYXBm7OC8aBbySv_ZRvejp2|o z<@o@}t|eI!>n3aC_%VwG>#ozoC!p3@&n|U1otqU*-sisQCIr!|?wg(EOI`>7fQ*J7 z7t1K#jUG59_`~1(jfT%IK5FlMOf+P~5J|biR3sS8h--p@N4ULDRp%W(G%zbQ{=))@ z?uM3qD8hPuAO=DZ=7C5>`Jfy|u|If*HvTR~!`QR%klzBbb(2RMn2~`t>?~z`kns)|oUZv}`1J_T8=z`U5;LgHx`>seokQHki zcs=01qbVSid*yFs^D?Yhxjl|Ty!|LnVPrm2Th3#meF20Tuy=)k9lg-F+52BI#NR3M zUA4c4FklRjW;utDM%V#KecJmtDYhtmhWU_T5r*pK2?B|V(C3lHHG}H#K7YXiBbZwL zT_t1d`DsNuwDhZkiAO-UOqT@G{bl8m^X6xi(9OrnVqNN$7K7^$duES>yJ62yDocqx zVPP|%nmrwI=a^jyTMb6IkKnqSZN8v2h~+v*)$=@QCWN}eZn*>`1Pzy*@HW@tDn|^OQ6~}W!Fv~M)PS#=V!_N?#mZ^a*!U3Rwj@gj8>6Nw*Yj=4R$MLBlf-! zVHkU5lHIv}415U@1o*ATgX(N;bl`o6JC&kqJbwJS+}QLFtqA21KSPwMB0pDz3;f1P z7#04;Bzq5qN)!UTtmeqzeN8iP3duwv#ZN;R-;Dr*M;Q(0M5k`Rsu6k*pbufUv>P8C z5O3)gk1x<+L?+|2Ob(p;>E2i$E#3ssLtlROlK-h?Du;Y02o$4cOA!TscL^$|4@Da^ z*hBMxTMNBJpF=3aOU_(QUd~R;tHAG?w;yani^x2=+hGCde>5M2jsVCeRs>@`zu^uLAYX;g>{rM&JQtH}l~x{X*my4|ajZNQ`-_hs zEt2qz?VB?7Xx}B-t|gl;$tl;Pi&9929*zGZ_nKS87-2E2Mfio1eRqq1UesR+srYf2 zSCMz{YI*^jZg(42Ir9-(CqeB}SXjRhmKU z&%o8CyWwiXxec-c=$MgT&m^7ZoTc)@tM-xqo^Y|v$}S&>;F-ntL__%*Up|-xzetCf zNnh3uZs&KD{|ajaeGjY*2Bu0eXIPejSkvqAa^wNfu#op4ITE3y#peuU0FO_W*33-= ztC+x7u<ut$!cR{7L0zo1VJuT$4v zK!~>Z7*n1_y}%-F_z=fr@LMLhB-mc%amirMX5@c{Z1#9zh*EM(io|cbKq_1EMAzQ~ z1G&CFEJ8UjP$!n4jHBRXij9(JfCqV|ojm}E!+Xwo=bEw(j?S|MC&w>t>bLanR)meC zL=@DjV5lS3Kt7#&3Op?pJe0?1_T&u0WQSSj&b5gVZ4%@?3a#w?291t=1E~eCy#wL& zO@6|(cf!Gf$WXT7tXb?mT;KFR4erB@_4s|Xlxx6(RiNZcutv?wdVaehefl98Da4SVFg+*mNgI_O0 zC^IsOC4JMA$>m?2#!8(^gu5M0owGRgbIs0<9gBAbfH*+pk}sY`P{D#KJeBi!VrzT# zc-<2azy1AnOa4<<6|q}rzZixYR+PRUCior3iHM}e17Ky0otso}bt1?kXVqbKiKZ}@ zX2l|IGpB4Tq)bYhBV`C)vo}_PGNz%$T*GCi6%N(vl+qN!6y5~>Ml+b0(LC!y8pBND zY2Xyr8l4qqW+WEPJu3r64`}BwEs?-JD@Ynkfo=E5ib`hlXFC>XPL5KGknzO~<12%w zswMHG1)NhN$%)LLO9?kJ1#jgKERggM4O^RFmSNRJz9|s{H*H|ePYkIBPm&Ikcet9h znRE`=&1<#2&m(;(2fhVkjCFJoVmhnu27};Xjw_x64^su75p{Z^I!;s_vf3=blv63g zl!Ie3CHY}DFWuk{KHLhzGkWJ~f?l^SfQSy8I`U}8#=a#Io<~M431nk; z0YENU-bCo9NXe4nkB@YOWm+4R- zV(PdJM)Iym-zzQ}t{g_I8+$n?=2l9c3y5MF=l`}nsO1#x( zAKVb)#{4eanZty(c_*IhaNE0=X436f0FZ*)`}QWzJj8y*F9^bBhG#rUa;pw8z_(IH zhG43voh-)H7P!qYVrohe#}lx$5jhP)37=r_2KpjH6m%@m5T`bD_SP*(ZbqPt2Vb19 zgcwB#I`&7}$ElIxsmUt!sm}FPedn5VamH=rYAC8Gqz(k8TST!{qVqh`C~!6R8U~ifI5p?D^)1(h{>0i)(EpM_3aEO6VhRAqmC>nvFn-aJkc^6bth_ zST0IU1M$9893@y;FM1e!*)cUefC}SNw^1pn6 zXNK-0x8djBSN5ZI$l-7T>@dsi6Vyw4z#8`9aPs%~1*xG82M)~Rk~kvAz=$zwHBgBY z#WwIr|LroJ7%@vxz-JUM<`0m$(Q9|WjJxCWbl^XF;j`U*Lf!&7&AY|m4+!!_fbvJ| zdx3JP*(Z_P`9<#%E!(By52IG?V>R1_m@QNhCM`Ui%uomRymbWXtO~ zzDP4JxMWqoeNiT5)84D!JZ_)b~YO|XH?9=L&uyd@~wtKa363z^@;W*EQSRUQdA<0wohycaEBTsm4uuJyX zPdD3xHo44nNUTb~XHT44o53Cm-5>5>!GXRLuS{=s@#qEQ$vQL;g{LZi=!03$CvtUh z&sNjodw1-AKs7Sb@dL|$2g2a*^oRJr1kms`US=v+=lGzJ=_9Gohs0b;jeP(5Pj6Qm zQl1|@@ULGIpuc_z{=aGv0Sc9@ZRZqFd~AAw8rLy|Q}R4#Wr4^uuR~i%*W*Yr@pEzdg;=#&1I(PQ=ID*`3oE!H$TdBQ-py5mH+BWw^T?fT!11K4St+KoKi~2XS zUi0SBby9`=a~VR)OC4c7ztiZ0z`%Ls#`J%yzZs~lf$ER24ntF%q=+|JL1~z(yIHh1 z@#sq=P+Nnb8=OcO-ZpQP_EXZFj~LDhfO~*rIlxN3E|DF59syWFL}={CEe140n>R`t zB>xZ;__3m>?2R`x11b?+xaYkJV0uG>Tt>Q%AqV~XfX z>83p51{D{VWv+9%D3eF1pT|$K*eK4w*imSQ8#MDwb7YecRbZFolyTTj|H?nVG2Ouh ztH5lD!X8`8_mAe4E-CfUxoT*&y^kW+Ee%?mC#jw87ZiU%21IY&33XG;Sv4|Z(M9g9 z>L^@A6fOp@`!p zpM3lBWfILeNLaXsp(Y$KXm!*Z`O@D^(3 z7jAyMtv*3ZkkhRcp>A}PN-fKCi^8S4F{$F|tIEUe#o4_oPBjewGbrYSjRN4{a|VhY zO2b^GEHL;0{?7;NFY`iH{trw`jpYBMR6pYgVzQk#JUF0I1IkPJG4uP2j5+l@$a4m$ zV3#HJH&LD-vM7OeFOJ#o2=p!z1dNo40Z!nRrT8}8MeEBt!}dfA(#0?^Xvx2Aia^>KoO? zDoquQdMSeB!x^OCEooY%OJxS?j>>I(X<V_s>j*>cD zn2`WmI{eA8!+>PyWtcJ;K3OmDB4Yku>?V*y&(Q5_GS;=UT+%UrcC6Bod#ol{?Wp>E zS`>c!=0^WvP{9ue-3O-{58wNBbY5i6AL|`l0`7KIiVB z)X=I4wT^MooQxw_5HXVGnn2OSPy^obgs6YHB4!U&1tLm>Q=Jx~Tvxea%&@XW?i};G)iyon!{bfA=C-W8P1R*At+q#n#`g^wbe;^Q!VoQ736nGhJk2Mk8A^ z8JR<(t=Zz&J(wlO1oDT%VR#Pf)ACON&~vOcqZ%6-&O2z(svKh^d3b1ps=Qs1U0c~( z;LJmVZ3c>wRPQSAaxPL0nD(S;3W6++j+v!-IW^NZn-)7*Br4dYKE}OMz?fN)acPo* z>X7f5l@nFSy)GA!d8o?QfxXwAFEns9gEEWi+;iZ3)n(r}Rr4pu{`yM2F+<$|AojDa z^b&h;Xq~AZIvuQVddQ=QG0)By>bvRr^GWq!v5rYjK>M3;$LN}3yJU^N`XU0ZM^Ga8 z)c`u{%atLAhTJ5q3Y?cWGHm+YVUZF|>mSKST#0bN$jTL~=n<>bKp zMF=a;p>#vlxgK^_ex83JEKqgI7-soB>5GdSV2N0k2>XbYq}xT{E2kueKkSl$194cSIDJvlanvOW=g#_Dj$|{a48sAp7~0 zFdm5k;OSm8v1W=8r98VA9}GS@@OOb}U0TSnBY++RmAGQidpXct^zRepaA$5U8two^ z>gk=;Us*$r6)|4>4dvjvcBv)A>9-$ottge3|o?dI$_9=8tPF4^7 zC2xz*M8$8Rp9@wDF<&?VSt{4BrnI1m!r(XkZYr)FY+l&cB9=t8wDU|csd}%sT)Imz zk{(S%mk0Qmv+&-QxR;m4-!V~avju%&go@Dda-42x5f?lGiTU2rG@foNRi^6Z4XO51 zQ~ZqLhG{3*b+^{4@yIRTcs=bY)ErKG&iNk$)Uw@Bha^+arOI*u{x{uUJ|BKrR&0!K z+v1sF_kLm%8$QJ2b4GI;rxG7}Kwg2ZZPBdUDGh1Jl}lr0Oro}*80=?n-weIxombq- z7o4GOTncMnuTD;IyE}hAvsK^#L*!|L(XrMhl*~_>UY+j{nk1gfymj$G9R4s!xYGm^b}#s=6EQxIXi zC+cxLbHfsV9ESx2dw@nSID--f^-=>wEVc`zE&<#qi3SM;jvpM}3G;oU6-Zec6QUZZz^Tyb=K#^R(W6!)kxLEM48N#yP12j&$PMeNw*R|Baj!0oLV}cjj2+O znaKeF!z&Sg__SbjY)WK4*02KVU>G{NxgCuodLdI-X;RIUEPQ>28JQOv*Ql(R7FIW5 z()L$L$){CpZWFcp8@#$9PB)xxAcfY|jKmf_bNh6ei+oit)+E~={LkQ6{E0s_MD#?) zgv)O&UD3YSIXtY=K4>j1mpu~_=qAgqI}gMZBtO#(PA`xDJya4-ufN1BA`K6q z1oTi$SB;y(4sB`)p(`)}tTtDPhUh01>K5}?7#6Rt`gcGG5rq@plz7#Kh#Ry9FcS`# zWvDT)$sROHKB}o9xBZVeYAjt7!VfCprE*n+NE3(D=Ha6Ag`V}dl$e~kd0Envaz^y+ z$!YKPc|)!uXt;AJW(UA^5{cj_^AZ6P_L-RI*qk^q?G%TL_oeC*{xWl}n!Iz>dGKy; z_yTW8)Y=?{mNSr#>x0Ns2CquBAZP4e3p30Cg?H0xYrU}GKW;^-(~}1~4(%313)vi} zb2CI~m>`M2l&%D5;7sYfby7-S>x|_Dn~h+VNySc&Q=SQg_X7nKA}>Ri9XkW|Jery* zi0$fkBqJ(wlWY`EmYCRkxlvfgc*+)P+HqZzkHq@26sq<% zZ%obyLs$;(2(1r0NNnd55eWw1NjtVR>ne$8VgUToXwz(&vsKp$({0O*XSU3temxg_;5vlvV&v9EgErh0g(W{IW89RO%buq7t-e4Y zufBPKfBhFmqXq!>_;JdC@K;0q+=yO_)PI_H_Jx7^qm&XOrDlhA4bnwBa;ahOoWF5n z=4VLfZ&9+d<1t@KCk8B;V6I23K4Ostq9zVcoVkh%fOU^07{w#SjcYGVvAqS7;;UtO zDW7`HIk6HWT(SW3f2u5`Jo8HwUCsDp4Dq)sB6)sau*$Q0Nr znbFvng1?x5d&ui-kxzvR{*))C$8p2r zQyIcg84@W~%I&|R<58~;=@Yz4UW0Gt7@xc4CJGs3jR|_QK{Lwi_t&25_piY35n7oi zJwJP#Ec9rVp;ucOfYe?jG+{4=@YGK0z?#@8Z}*Yxi|5KDQfz~#B?Hn? z*MH(k+LsseGbeI3uyH1{@H&JD{WHeGSOuJH1%hWygm6j-4%&rCNW*RZA@CW#_T%b#t*_v653PVu1s34dQlzl*~ZvwRPY4ry|6LeQP@X)HpE`= zIRA^Ts{pH_d-`-=y1P3i1W6H)EozjgUEiDa-AocCl z7xcdG|GUp~pMCbu{AT9NnKN_F*}c2|-pl-V%+O7ub{2Hk+wSd)O2zR))!paF8YP$* zyb?lo#8?~1tfK3ftz2~ydLET2m_$eH3o2i5;p)8YiP+DX=4^}?Uviw}+3C8qkDl`p zZ^`TU1=|I4V{~NAPt3QSMowbeShcQ3_l;;jO$PS6P`vk(RW8qW$9$9_8MYH;NlyIf zkhQL>|A|KKV(fscs`HIDf1~2Ace}M65eHqXO9v8}6Uuq^ThHIy@rm-My*kv4nCWvb zsV|G`e!s>1;hQoOwAtysTiV5@Hlt;N*oavNRU~H3dE>wK(Gc>{%eb)-5I9MIs3dF_ zpw$Naa<+Rsf>5yAAoCr1S8ys?kQ6ifAmfb&^A=&z3A=vSX3iXZ3Vwa~!P1ErHu2&A@q|kLE zSB}mio9k_Ydk&oSSr*S^z0ASa1Uq?3us0D0WQ4UkFI!@dbJk5ijA zHPA$ODAv^}xoO1h5Q{bZWPz40RqZA%THKzZCzSV+-rmtIU_b$aZ<@A$HJ&VMsC*}t zdl3iCerrA{EL2%!)0Ynzezii{c0MTGr&RGOM$3)E((I8Gc^{~^vZ7~r5Jzg3{-*I| zLzdcjW0Si<+IW83gQM zB{@q_#824RRE)pPT^$_~Bc-;gDCnAq9x5Gz8V+>~eu$unE+UxeKqU_TP^r(;kcNfw zQz3s`BZoqASRu1j)u*>exlDh#V+H%hVA&?pt8Uxb;Xd+9N14UU&^5qS4>2 z9ePzr6CYOH+kO|4+R;ad=Nc(#>+Y7#Mzo_!IXNq2b(_^b3)5_UBIO!~bN$RrvTW>_(C?+N=JT>S^`YxVfts#=4T-yXm z7-I=nwNAEe`?y%9>s_`?V)d#-=ON?Waq|R$*O-ELDq88`yd;4g~o1o zS2BmIU-vLZ`NGe{p>SG6CcY;IdCng52wDgYl5zm@wrcnV#RUz@r=IiS%P}R3cqrVF z6i0oU$;>7Z%E^5loNao(BYRAEpdvGy@sobBg$(n376Pr%ssT1zxiuSwO6$x~4Ep1R zo+6?!BB5#f{Dzjmiprv)UEPf{dxxxW+ibSS_-Y(-Xo8^c3Bnw^<_3I^@)TN>Yanc1Sa3jXx z?9ulPAqi{L@c|x^9b3-J`7dfx8$!pAsP$b!W&rfAqlGG_f ztYxznPR6GRTm@b3s8?}H{nV#remd|)3>q@86@a-~>3FTom={MtAd3;wX$7TiJ&=3l z%Zm{LtO-F(g&n3;NfW@AW`A=X;UM!io%&!ER<~A{*Dt5r!soq5XhM)!D^T?SB zoqUds9s#3QR1cOYK8<8j*0{dEOP*d<$)F?MwlREaFpJXNdcWi(+UN(XTe6yg8zpo$ zM!z92RkKDYNt2BBI&b-~Wqcg!R?CnttNW2GG}RR}3mO$v2R>xe7T{7HnQ{?g%&9|G?^>CMB;M00F0 z_uv7)pY*(Vm6E{}QXjVUg#{X*(&Y`qOFNf9bn_ia5T)e~z%hP7Gj>FPkpIL^Cwo{~^c^Bu&M<_;>8GgNI%4#>qW=q%+j!ARzCNQ;&rtz%G8Qt%h zxNXHFa@(TS29cMsS@t)jjdLEdbiP~gS?w-j@mgi&00Lv2H2al+x&r)di|pCHnuueb z@qPPa-*ghmjZIM}YTE|>hYk3zU01MOM&ws^%%^|2zWfpK<~X)Zu2L(nx*qC^fA8=X z*LDn2&m2RK^b*!r^%>znM~13zW=_izsWYpCGo8)14&RVnH@LfR5*TIah|L1g^TOaz z7Ge30@Ax5RIF4Gmd+;8c&r&Ei3z;>3nu)R#$<23$7YM6A+*WQPeZ${6z%`TC#-FcZ zMq1b>lL*~oD=jZR61+8WhE(4Gb(Ci1I#OO)cRv@E+G!);Jk6av6jtY$^ie-gmJ0H% zjOrnE-Pn$KmiIdM1KF6TPYU9+8^+?2=iL3)CeP)KvtWJ!@=@bj0OMHV)=@&-)UA?w zr~MX=o&=tyA!EA_&-A%&&s2P3AszGdofXudKj0Kxwrg2DP;if|mt0B!A1{)x=XfK; z^xOTqiWhWphfk`TV>vlzibq?cQGM05Cu>GGSpw}1&hhX?@xo@GehOEk_i7B;)R0_7a+?-Du<$r=m1 z=N>4yE?f7x``Hw2f(58FEO4Pz&I|(w_KKJl4lPe`%!M^(D=1L1AawiZ_w>VE2ZvXxNWER=)8$Dv_e@=G&>-Kgoz(DgKVUUglT#iNce+y05x-ZF;`JKdw6vjF781q}D&t*uUH z*~;V@JMj-ZO*z;R?F&8iIW(8ruj{GX=dE|k zqiT{gW$5lFh`sJ>hb8`43t3ei47m~7_|*HHH+9pLO~?;3Wvx@|i^fsiZ->>g z>U100l%wdP*0$0fNMk*Y!k=a}?bmJp9&UkXuq)J~{j`RU?xNw8p^Oi}Nap$RG_*00 zqQ79pD8kAC#|ydZQ#iC5$7$i2-cfoOVcZLZ68vm^`W*9D?6;DukqX;!iUP>!%XKRhicel%$VPWYWm!O)AGd2 zsubb51p{lST|%>kP6(G4kE{);UMw)n3h1Y+>XCLKv`dQz{Ya6YA<$hpM#`l^YP_p1 zc8(5zP0{ZssX-k&0>T^~0s`0Xi`ATdxHz!8o1BS0QJmj3RI)eluoUya@4&1HVCJe! zcTDO|Lvg@hJ<@)iI1w0FQCGR7XlPZD5tY+dOy=t7W*-nJlO)8-p;V3aEH}{O#w+!? zpPxTTRpR;DbQ0eo)cz8rQ8QI<){NY z^;rDRTG2Ej5vqO#VRe|ri5ap32@Bilv(3rKw^|9E%2-saS*M0_N!eFsqPiaRW(8J6 zXWvcG&R`;(j$TtlsK`6GrQnNTa%49TmE}ihpMAbIqxv9JsCF@k(3<+0?u?$^tXEpv zqb-vJt}hM-3QfWHn1$4Bb7*An-d($fdgnSbj@&t2qe?jjeR#ZIkxUo@&pewO&>7OLr35jJb)zC?osGBi)()-9KgT7_EJ54K ztf0zVi4>AMtuuroI(yeVGM$jBiR@AN2}CUWL&U2mQt%uJeO{dgRzl5Ucu3bH4$++P zKA*kFy!DiActdj>v-^qkcv^}+vC5)+kAI*wgLbjpTvNU5>gx=*2vzl#zUTtiIa%3{ z1c@u{(|y@pN`1TLnRH4Ep9)E_3{#*X@8xQN&t=)Rdx#E%Sg*a_y4t1xl%y`CRKcsn z=&e+Kp~tsZVeCZ2>&?QR<8*-Jsc4zdhKorkUgRhHT1UmeO;b%WUHzSWwg8e5cOJ*P z9TM+5!m4PF*=to{;}0X4^jwTuLhWmEZSoi{(MlUz_J8&^_qz$0yyQ+!jt14XDgk$6%KO%u5>QHx@>pwK!UPeb$B z4~3Q_yCH5C)Tmnxqy}p!X)U_D%u}O-SO(ZdD~gZf_wUqT+-cJ#&=Frk@CA=A(XB<=f{ z5AR#zCO6NUqGyNDrDKhyYvIWxMt=T-7_r{R^Ic!^0*Z@q`s8#EIT zYTJ%!?($;JV9nlttiG1L$8Gg8b~JOIOx5mMVPVcwJf+Ekc_xLpt^*(0W_%vY@27E3 zO`~g!n{&T>&3^Q3b3lpWu5;4NwUP}3wLUJ4n<2J)~jY%W>g3 z5K{KK-gv#8ceim%g3@B|z(ztX2Aiz9q;j&FLe0N|$eP8T4d(;Dy%>QydX3*}ry$Kp z^B%SGMQbuK*$k0!(#8j*g}n3Qp<#)ANsqO}cQQz;1Q37HywLkl3##MSxxT4B z-CpiI-1T;Fzhk=mMM_c?U1|O|Cg;S8!>46Z{KYeRct8+D-tQ5iI5r@E39_t z^OqHbzwPpleP{MQ{)6|jZpr<;hs)X{%pYE6df?hC@Xc?SwoS*?@hyZD$NZ@5CYlD` zF)SqCirG9NYAEF+=g9Qd<0gkz;c%#7jlI5KtX9S|buA2?NLWz+W=vVsXx1Qff~dceq)86HQ;X zl66JDgTYQ@UI<%Eu0CEgAbGk=ah|^L%QN))_ecDXO@^__&7*x47hEJ-pyd_|(~$}# zZ)4BV9P5?19u7@S=||pr@0LjVQuB}|e1TjzlIhtGu?{ISA3E&~Cgt8Jx2GGOqG1}O zqdj~n+8=7NBEs8M`iJywio!c_TZzP%>1S8fJ7m2vA1Tj@C;8w#+M9Pmob1(uhSc1* zQf=>1^d8R8#5~5yY2BA6HiA|^^=u(J^ieu4z1?)2`~WAMc-;x(G|WbFaNeDGddH~i?>E}Nq7xY6tw2KZYT)c>7^Y5x~T6VK>+zF zmEQSJ7aXZ&)$#tyxu!=bP}(0|m0Zr>F+aHUh)`81B}U%k_1y0gjGAF1i{u9*m- zTj+dmGN9xc_5OM0j~#~yXerIP(sm4r=ExCKaW=(&2*Ux(GS@!~v{;GRn zagZ&(wQKM}d~5z7cxtp(=Zn7+WGO${KTh_kYrv!Nd1KU03u{rUwRWw+1Z{shkDNKz z>+_ou&m2c3{A{^T(x!Cg16C8j&HE{G{Yeq#B!} zx2QSrm;6t-#axxYH`Ul8$%(P#m@ju1N zm=@U`_xrB(*F5N-pz{OoP&31R9Vkvj5gF(F%!ZM;k#S!zDjBPsWKY30k!*qSuN9%E4nMYdeBpKgP0N3;YV*tBmn$ z*(!GycqgOC7C3?00t8xIIG@wsbt;`=c|-J)Df5Ml$n}?2OU_#*RMmST=|iIR?NY{e zxS070ZZ_%u7Pz+D_eAlyu#v5>$x0LD$at0>RP;!&&$>aqtgE2l6G5Mh4>5KpM`=oR zyR&*#+0uP@L194jN!|TIGSD$SXpFjK5v`Db_LDuX(#OEP6rG~zm_1ETpEwiI@h?HR zf+W2F-y=2yjN=BXkGIj!6$`vru4CZEG0{~kSxnxf*Bv0zVrELQFLe(OCx$*RqKgS0 z8?+%Cc?eytGaulm9)aSW-T_;#zz5_zLkDQ2U|F-hTWUm;R6p#{c%a4y!Rc<-Q0@x?A>+7NY2%-y;bE+ltaVB zj3FN~Ph=($Dh|YAMxjZPS;}Ux^A>bd;#IZ&k}OXDIpeOQ?fOajm(1eNlyqr>F(~0r zGb}2KD=O{oZIs_#zh7K({xBQdhP7r5z*P zvz?y*kS1sbNVxZt^p%lIw2bJqA7|jF*A%f-LIcKc7jSwpTAnFWCRaVkw_2b2+!wxe z8yYX;GNJW`L{7MWR5M^iMKh2R!f^YBN~`MWbz+G1tD)JA*1rpE~I@_7O z)0ualb=@suBczmi#*(cc-~lo3jek&lN;lT}eJoNPLS|vk!P{;ZQ)bHYg3a9WORp|; zF{xUBUgJwuT4-puazH>NRUDF{8Y$5u9Vuq3S44yi{=ATE+_D);-qz(9b3NsnWf%UDrP0sOM_FlBD6vYJVV;{Tc8%L-AM2}0 z*hbd&Dk>u?t}P!zde8LMO`Q2BklLbP+G$07idfBNlKb!YM*^c8zSL->y3{*xZ}d#QQ*x&g|cJo+P3-PFzu@x}KZC9w98EACrc z__q`nqb?k=Hn6z;oCs9t@Ft#bM727;gcXQhVZ#zD) zfzRKdH#MTmAxES2?3$~%z{gOBT(?~nycLfs8&7;ZrA@jV^!vrlEGk6SZ=<6}aUNH( z7fX7|ZJ(|Mx_=$ql9E0YNdBp2f?_hO>~^2hFX-&%DeW7PC(Oqlx9oLqt>28PIeQVx1;kU-2lzqTD(AVM}WhLEta8n|f>_sMW9{6T(>eSY^ zDE)m8t9aY(-TdVQ2n#)ZzYb5h+`UMG+7d{~hn};(0CxA=vU+(QCQw_dWZTg`JHRrD zzupUGQ}L~93`SAOs13G9$mi@pBX4Qm$^8n60tUy!#R$UL7m)pCwEM{pH%>i+H!X0# ztzz;;t4y^$j}}fI-F=@!^!2V{XH88%(~CC4V|>x#8C43d@-xYxWk1Zyh{ls~Xjb{% zX?>?|3Z4XIiiBFZ2pl^lCp_^pLa9j{t^JQGN)Zl$qaVi=BOHQ9KXzzFj2P8Nok$r+ zAYx29?jK9diDV|SA*?E_M3`Ay5|0@(B}xWYj7;hW+a zJ|)xGEm1!0b*h%9in@<{vvY^{PX4ilIST=|xHlH+8dtXHo-AJ8CZ;!)uC9&!BD*qm|Up-iAZ(a#Jew z@S-rLFmM-grj~hn$G+`W`DBS`^Y-7MNO-$B_a915!VHp=GMwP3~p-Y=i^Ltfc%^^4iEb7^VH?34H(1oDY< zE(3Zmx(b>5?@gciGVUTSdf*fvLAgHfU7xMFSnA(=VZ?0W5xwRfrB7Hqkv5%7sI|vT zt)~;e$bkD<<`sc3O4bLCpVrJvi>v(t9_H2EG8}P=I60;y4ia?`RbsYD7Agn zNP5765aD7Wg)Spp<<_aGXAb+#;>1t|t(R7eZ8Vbx)#o#jgcUn>osHzdT;xz)ii9!> z5-Ls{fza8KkNhGLX&3a`QWPV#hgvx95iJ&9Eji0tClt;Ua9fX%+_r*RqX~Rm=rj_Q zr#A@b06j=z#B1mBeY=Vc+n31}q&cCJFJ8E5@%1Y_OMHe)(41|N!b#w3r1834t3iox zj%X_*Gs}ut+@@2{W~84tM_nh{U)s=KK6 zm5&GO^I{ILWoM6%Nv?ah&+k2EycRU{h2S)?rOX(EgLRIQ2irN*rd@+wCB8QAc7dV? z7sriobjE|Aci!aQWKX#2gS(N?`8Sn>j%6FfwG8f&PTXCG9FxW^9v$9uf;!YpKK9u? zdbg(arujKKx>n`j09m6?{x`aknOmv8o&iOu7bbV^r(6#s-|75Fz(;Gv@w4U)JI9x@73pCfEqiB z-Y#nLc}GbWDy+{t{>AmBUI;DpTS%WnSM0}7KO;762c0U5-0BqLsff*fk9jE84; zuY|@?K_U#TXYSY!DlImazHkGO-;K;Ik@mg6hsgj>Yq30oj-%Wbc=_!Fwpf-c) zXv@5v%F94vD?{_v40xMfNDYsd1P>rNl1LKyLD#!rT5D55bMt1tXJ8W4VTxL0!BoQ7 z`e?-qea}09b)YV474r!1i-vsLy4ra+JLfR}Q-*DoDLul#p#5 zRY*#)CRE~7?iq5{Pxh4!TE)y%e=t8ne0hon4KUqOO;>nunkRV9-nm-$8mYDY+DpN% z?a3cTsjF`e&cFY7+lWjqE1&+}BA8^(ecG)3+p*v?L#6Wsy+SW1%_Qu;!FSyyMCw!L zWm~z>bmD&6c_9PgXJ$S_MZp&2dTX;=QtvHFlCUs86-{C#-`O`PNZP(ebo}yzL_t(p z0qzzFuPRNH^=DkuCt(Nb^MNURw2$UYT*rxr6TtsZ-Mbm@CBf?A#2!xWeLzio@0KUk z6El-$eq7t6Rs!lC#(}soMn2+lzFc9|U)oL>ZB2nRl=Q zKW?3D$Fg}xqUhkw60x(*4Sm1MV*92$o$T17E^ly!>uf_cd?95;<5)zh7{b==BX~2mRfO*t+|s%s3?euZ+M_9 zXDUMT4j)6xm5FD>*_mBzKx^KyLK#N{8-H;m!=sn6gfH}Xh0jH{Xz zXMCelWxm}P&D(51i`Z5uc;iTp(I@Gaxa%-k%bH;K#n-)8p3cG7(#h6|)ycgjZB9@- z+C3Q2k&%Zl_}o6GsqIf|i#{ed9I4K9cDVfz+T%3eeSY3~j^${&u;CFW&@LW87HLrp zzRodT|2=Y8x%FEE56LC7G8KyC;~f5}oOX8Kr^Mi+*(Bm*4j#sjtWf&KOkW@Jdxknx zmg`o{xt2QYGJJ2e>dk{!V_qYVdzHuh=Z71}FWB>vnObxXdt08OiB-r=cJFrCY9_F+uz%}qL@k7$`k`&s2S z6S7(9`u)qTgu?gk3EHYENIWIkZgGT$H#9h)`PtYLj&Hq1fG&8VTIuvjKzl!m>!hGGrV6-z-uWRf9G(A#aI>_ zck?~9EE(_MH0@7_t!mGZ*I%zKQ4dwTzTB_x-va)nd=p$n|9Tx3CE%Zfh6OY|16R_? zcfB3%=u)4ndrvtTQ_vLgv){pQF5wE_W3P@_xO)@(S+huxMBB`x$M+u4^*CNE7OfTpH8+6I1(j(U!QI|7fBL3y|qmR){7BpMF9p{wqx z#@-vo2tCon`a`+d;*W%r6u;-+xPXr8)F~@-evZ`~L9V?!mh`&9#tz64r$?Fg{hDS- za)(G#w=db(ka^2rH_g3!Xn8+Q#(XxRsVE1tZ~Q&2+P6`xiH(d9n_82m#SgS4He{tg zIX@e-`;TCv%JWVvum_?FqQtpB6k;hYTelvGavD>V+t9#9@x7itORFY7qBH}2(IY8r zh;BXNq^j~Q%R8d9mDiKMGeo;ryNMia!_LPOa!Hru47$1Udh zx-aiBdlYid$vo&T<>kMf@#)jY=knERw5Hsez9adfrE+Nwn!Mlz@M=nX@rk#NxzDiAeBetwPLc46e|cZxsu&YA}C^HgGi*7;;%V{*)+D*2Evqj%=TA`Uqh4o*syHqMkrYwp3Y7nU0jU{bXDq3+$<dF{AK;CGCFYenW8)VE4UsQR9JG)e83q-_{A) zip>HG_S{O5w}-JfMbGXDPeOSjwa*Fd+&*j^phE?OcanU#?Rny)zfH-h-P1pje=+am z5D0PG!xt}&{{GqDdit5Sf%!O(o=bnrL~p_8z`neCRCPp$^dORfd9%BEhncVOZsa}8 z42mVoC!VtL75Cke5w0&;rkV6lKCR3o`Vh^y7imV9(&A^Ry@&KTnEVrz!+n9U*!U)1 zNd}p8S!Sc)zBB>Z^R)-uYBf?!ZS2gqLM>B^<5fLA>Fg6Pcio9oV{yV)vWRr`32*5f z7P6`7wZwXLXwdlM1%Is}RQYR4mXP+LHX2)3m(pSv$H@iDe(w;~+Uj^P^78!&r+~+8 zJCN}7F`K0qbH*F-MY>3S(6^Sj98>DuF$7GrX?>K;&D2BzsX57}9CsH}X-Wy^7ad+c zihI%Nhof>v`&w^3qc{mEa?y(zeT5|4yb6_qm}112H130aa1CWE@>9fDDRF5`&oVD= z8DM@soAr@+9kGFTj(~)y%wk1jW#Cbit7BOjBQ|K7D`S1i)Tp-}wG18PF2i{AYVW!} z(T|@>RBYE4<&P^Lm#0J1!ZVRkGbn?5Upd$vo<$3G-81iH=3p)qL^~-K4Ys#TsiW#_ zcUVkdCvTs#w21q8f61Kg0q!$}0rQYOUzAo)YPMZwlaBJMM7V(bFOt!HG6)F7*=E{Ltz|6+e{F)VEq}H=m^~k;9!b7 zm8NO*CB^^9wYEeTI640#9_si}L-x3i#y!b#pwWS1Ik42%9>*|*x~$qw`iov|IfI_j z*QlTE%o3W{2+tPJc+>47Jq1)oMwp4N2bz9A3%j7*Ni4Na?tlLBq(^pp+Vz5-%7r2c zUv~KsjrkZBUwu+X=W0n!KYk4~1~`7qK$p+%@}-PK!=T&Eq{!R4fP{-GzsIuei2&WI zNVeqnjovU{L|5TQHDEngyP^r(8p zd1fJ~RW115L}m4&k4N%(^Ijyb^g?+nAL$RAPxU_K^}XkRRdiU-qWRrCn*#spUk~1@ z{I80R3G`-TL!i1R8ce$6XHFc0#mGDZUy$VW=^UHO=C=!)GW^3bW^QvMej1Ayx%RyI znxl2jrc*{pq#SfN`bas@#z$@u&n^SAG=xhs)Wm<$urjq zYD;j*bnkl|SvcwTOhxE)+AQtrW7lR+vG|V(+Rb%Ft;~mib&W^LEa~Od9T$0Y->X)e z-DX8Jb2rqkFQHes!bZSiK+vwGg=MhBR;Jl7){a+iT&T7Gv)#GX=BxXo{OMG+l9)$w zt~b*$Zd6<(D2JgQrx8JaI%(qtk$x`y?c>&EK8?I*S5rix5?)Ir*!3)2i(TE<=s+?&$nNIs_B?{LClUvxW_#Wk z^o>@Vl6g*^;kbK#%kmp_=E(Wyb>8$9Vv25P!+d#OYS0YKQ-|!LS6=E*Un>mn=a5h? z>5--}DD-(p-YO}dH|##sRU|k}E<%znycyVhe++rGWVNEK7+A81Ef*~|O!CBQ*+hMz zKU`Fo4=~VV3$^C8Pj>#`&dVuT2{qImjj1dHQyEjZ*`tW+4(=V?jrV-gln4BS08NGC(}j2F*j zynPh-j^<=H;)_^tm2E+5ID1m9QgOa%{@K3T*NGhH#6W*Y?w*d^o7y#}@PYYH;ew}@ z_|J*bDcU0MRJ94ZaQX|xf6kaylR>M>Cp*x0w+Q}8cI@CBy#0uENTA_;&nSnwGON^w z$Zd4qRf(6=7#}G2ax~Gr`84T_vzU!rUZS%z90&8e)(4DgoLs~3yk_Hkx6G4uCiebB zvtGQhEmR7p{TYGBD6fSN?z^}!H)T#6|4h7}_>?{vd`+EX1S)e{xST1i+g+%yZbi1% z%QNkxDZF_@DD3ui&&)$xGKG?uL{qS*`a6keW2kQ?ZzoCDP-D-~Qow4trCNp`T{L0_ z;fwCkfR=S8>=W7>^Rgwh`?4kGbuTA4Zfqq~vv)!HJJ(BeUCpbOTHJ$Z6Ij@GO`1Eu zao(kMQ8_JW3lpzhIkS>931ixJZIiT`!9sswg8XS?RNz_ zs5#dC6CB8jTku1}{o)?#k*ej5mnmnmM#euHUK1VX%=nDhWRBGm6>qETLQ&7(HeW!J z(;g0yHnhHEn|_mP=_qHE+G(Fny7y>%$9x$t5qj}L^!!AzT5Ix=EVW&5%4bt+2GgBM z1)srqH~uOZ>F1FqHL5Gf8A8}$S3wX^L4?59UKG%Dp~{tCWI>Nd~7NR zB0?2gCH5S61k|77l2*~QVILubKazgLz6Lug^`wo;FSzB6uvlgF}Z6a+^nh&=nJ$ zCopB^mN?6p;PJK-ju%c@!wLv=V0sc48V0o+LKl@WL$aY{Kb+nGxNFGY6CG(v71I9)YF-oEh-I z5Q|F+JaEIp1Nd{%Z~(JdT*9h_L7a6Mv}XjT8wO4IgmVLSJ~WAgh65famT}r)qEa?+ zh+y=xZ5$=gzg4Gb5Ny~HgAQ^E^DHVe;F(?FS27ikYhUmhuYd0XbU^2NS zA-b@JJ(Yvl!p=7pAW#qs%qRY37b>7>4?zd$UV+BFRe^ZWfsCy7kXV>!Y8@bK%!mjH zNno3gq9BeiuUG?+447eE^MrKB1MnP3eGM`ZXG3noh(>u39vCsS1R?-x2KwKC z8rw_2@Q4B+SXH~FkOP>Xc#}cQ&q_!%Oh6QP0<2DgJoG8JXh455E`C*SEu;=6C!`rN z25W(78zdhCd=n``iZ#>Fsopw-hPmf{|`YEf{O{@4g8_f!enkB z0?qGG$hrTePy%NApvfSgsq!&NH7ayHIdLE|HDQd7?u8iQC|MWH6q~vyn_(* zOB;U~|M3?Ma2SLTGXCS|fd>oLV9z1k2fr+r`oUvX03wh!2oYcc`9RN0%*S?>)`L8o z;O#G5aC}NAzYKkXLh)DYes^LYPUP1vaB7E51IuN9K3M@8Xum)Y&v(gAwQf>|qH0C4pfWB#5*8BE*`p zpab)GxR{r%9_{SuXaskXvcQKE!nax!h#LOgYFHFzNqn+m$3Q?>Cj2+w4T0a1O$E>s zreK}@tHl822&gq%>^H4j3?F!S4#9-^5GKt_#FG;MJLCj>ojbhNcT&F_Ah!Ca0bMXr zVe-F4mCB<7QPY3)P>+Jd1@+%3sxb&=ES?5BKtKCOnMf&wI|MYHhXesZ^va2_j&;)g z0|OdHA(WTK&%%VNnOspRaQ-p8`A1!NJ|Hs&Awl|S1tXIIPGb#LJ$~&34i(yg#hLVJHPM}3A+UP`u=#_Rmwk~@ZfF~fX& z$xP$A<+}k&j{T2h#|ap70x~Y9kbuB{oedjyNYzxIU?H^xh7`Pa-pztw!C#Sasj1D7 zE=(2FboQTc>R$wzd16l%@&A*uzBCZM9QvOc+}3}$#S!uM_`OsEJx3u{2GyMWM@{TD z3=!L~O#rA<;9lhpEOJQy!2eVs^6i%joAW>JI+Ihfgf-&lf28Xi|6(qk`O^{T5tCs% zAafzpZ{W}nEfM}rbFdk3;_Z{9UlS$I6=MoWCdJD1#ZqkC;{u)KXG~2ME%JE z==FIpF|c3p!g3HQ*>7%3GDLg;M-lfbfey`rBaEBzHx*+JLVB69&u22h~VRK!6bhP@!wd=Tm+rX!29p=$*2f}(EX3>0t@&q5sk=u8R$3T|Af?=9VF}mknQc ze2dHt3Pc12!Uv3f{%>w*9U>l}zXHL#w9s({l(koKMWy>|-uX|(gmFYw{N|u-MWldB zSPYRqv83RiknVzk0$=BkYGDv&pneuq88ZE+QboId-H8GO*1%$7+42{U_u3!V$l1M? zvINB{{70E2TaW20RgbWaYPke^+Cd%M12$8$1xs#i%yRC=SE!b_Z&gSkm z0QDH;DsDapRZ>~9ARv@K_;*=knSe=P1Vq*$c$YOXckIFg6VO@*o6&a$8xO>Q&pL$g zvM+q>Phw$tjTIaPGH~YLVFK^gAu5-Q&L&)=yZ@8X2oJ_64*psGk7G{tf#qvWdBE|H0HzuPIEX9H6$B5Ul|tf%o891Uf`LXV z1kb_(KsW!izG|S~k^uBo132)M;Y3&6fX6`qXB8xTxKL#qWN4EF?Yartr2+@$m-!1k zt%*bn7g!y2$|TKT?RyL=RfofkD_r3?fX%Hxb}BvRNzei9^agth9)hfT1>yfSk-Qv; ze%oN{TeW^u%`A}k;bw(DVbnbRD=Z$Mumj=0^f->o!xwR2%Ur=HjH9&doW&Vg_FimaMNJkY53R3CV0?l(`M2)G2UfbRA9$x9=4M4ZwMcL|85l1e$ljf$}jF#z+es?n0O@#TsAq`bmO*ngP=TINVOg$mIO9325cn!ROmhyj8OncJ^Uk9 zOgT?K4oqJhVETgR)+7Ul4k0p^VxJaT*1CWuw}R6>9ytBi8DL^*0o-fI1aQ8K@plt( z1Wo?U-hTKKLJrKK<6bS2LqFY_y9;I{8PG0WIGlqPJdPf2xkm72N#QAI)H&!O zc$}~vJnkwRwUxi=H3L<7fvQa4RB@WXLl}UlDP#g3M=u*2`TEej?YGB7rT;J|2> zS70JQQ|iy!+p*##e?oaB-eu6-%kVHwI0Iv5{`nOL z->>3ynQeBlSeB##=oy%8Qp2uz*ndr&E)|n>XVMsf2AhEf!xvW7*uNmA=YJN^VT{k@ zbpNMs=w4kx=zy8OR&Ryo+qDY+(=C&!e?i7ek@4Zmr1_U&y+qJ54>0Qa;M^IJeTBmS zYA*gnz5M{g<2zu~e+AXS@3y#>!5}p87`XKRCWN^B6@u#LtUB|~R1-mQ+#Dc4l zt4~&d_|9+KJSz$XKu3x4dxT%c*eE}%B5;9>ONw;w5S|ZyME|s?(F_OWGlKGATilnQ ztN{Mgzi_6gxZv>o3Au{ll{ZO)00Al}UlBQWoZf)2MaP&eu__`kuNM*jvM zfBuuG@fgwL2uTnSO2I4*zuRVhA09{W|12$1DD!<1KtCLT3FGEv6oSXBfL_mkNdQi8 za7kdzh1JTHi8}TrFb3io5fG%{aLv!JaNL*98C-OEp#o;>c(7nf!*L_V!?=k7{3aAu z!0`K@j^BZR-p+sXn@W$1D{>hTMz|nBBJ&C+0_VvvZ;!w=uqJeX@xThFNw?q%f(tjL zZVxK$HvxO@C)gbL1Q<~Nk9vGuN+9(3&veK$lPIVGgh+#(4exipwkrtZuNr=7_6{Cs zwnEPp^(t^si492*z+%fw|L+|ho#88PY?A-EuLqCtR5bJ;Pu&-K>uz3Ll_NV4P_ur<0f~}1L2RpozSj}M&et^~wl^kxDvrsN4fE$GPgX0Ol z++y1PhR~Da@?3UY6Lz;IKiCUT@&3)7?fjcN?JsUdY?O3Eu%$L&OO4=KD*yN&*%Y|f zFJ()K#NYVe+!Vf7+-yMY%%3FezL{-L1DeAC289Nkf~}`8h%%6x26ourvtA5r>WM_q zrcTf%c*x@r802b|MwlZ<3<0-19#H*zKg}odw>fE4xcGn+)t^O%Vixla*fkPz`hRbG zY$RPluC^cyFuP zOLise+~h*{Psj(d53RO<}(?%7Fhpx%hql6V8> zCK)mCr@{r%@I4N`$F5Gjx2Ke*WEcJ;p>t;^HrtL^>~BZYHPMwG6dfu7gD-|I?F3*A z^lr)My|k5(ZDG91noMgZZwM`H#yQt>Aw^J*I1W~Ebq3g}%MSiN0Nrm|GgDi{hX}R9 zc?S(~b?2}LjlCQk*oblGoI~DsSDF3$DG@-Fi}z;e9^xN8nBk4re0NT-(1XvEVIZJV zFb47rAE|U34@`Q?gt+R$DzZ8w(iVDf9GygIZPwBJ>c{X}k@Ft7q)`++ zpn`|Iz(5|R!LadOf)CLeKD(0AXCS;H9bUn<#Q`ixxN`<_V1i0VmU;?p!I$KT3={ea z(rb8-N_s~Hhp`?(X(3*mnhD5F|}g*^o4xQIMqNR9c!ONJ|S;jd=wnsiQZf z>B9wS`W%%LBh91IzeWqvL*AT=MEjKrK1mk@&dp^d!|?y+@e`;38yCgUC9kPOitj# z4qDf+QbF~Y+JeIdqHz9+o^HxKlBY5oo|(=ZTf*Te#=S7IihtB0?}&`ljGU2aX{lpB zO2xdapxWe(skxvf$aLP*YLPitWQdE-(Jj0La8m79V=PMK_&nFw& za87j;;16Ow6@&pP895)V6FR;k%a#RvmSk6sh32E0;82o+Hddsai{={EQHMW0wOK&4 zPMh>mZ4j&~vi(&ctt?YnjFwM<)HNjAq|R9JqfRh(bY|v=)RF8VHdBituv8S-btY-# z&)NNZ6($Knvc62E{-|x(QD>J#OXk?Y%2XBBq<49ma^*qrE`9)XpT+A*s@iESKB@}q zFbN_pf26jd|Hll=y#X@KFlutwFO@WW#1l z_m5K82`C$sTU%6iAEmG@Q6^B>GmU6GLLIyQ4KYLgsMNHak=dr+O=x@7cbEeUTIihr z)v@ZwLmC;bbNQ%F?5sE+l&r0~e|L}i#~|HsQ0J_b+nBfpat8Bvb4WxWheNF-i9U8% zND2Zu7d)2I$Lb}dDv)bNQ98l zD_Y2MwX5$v=;V)Bhz+j>uA=BLsRGqckCRdah~02}Qf^Y3?UGUobR?65gz%qc`$^RG z!`k#aS3=Wi!mf$2YmQBx%n{w*u0KBnLWyjFE5F70Jr+iTB1 zXyG6;!Rx{B{7F|lYbM9S18BTgGWp9OQL z!hUQEt-fcA`Jrt%%5VDB#QmiA0}^Z#UdHspPXtmm+mW}*9lr*Af$7+&WO z0?!bPx0)UuIA40uimGTkNZO7p}Ne9l`Qv`pS++oO5*pBX0Ml#?H zIPrG4E$2>rf;k@v{#Vb_4;)ebK!iM982D3_2p`(h!js=!k~m|2%)2@sy40YVIx?Je zt;n$q;aW(RO58LcxCTWu$BQkiey9}*2!;Od`&qac_pfM;H}vkiSd9ibgwT&IVU!J} zc#*pyoVQfKj~gdj`amCd=+lPL=Zrl?M@Yb?k!gQkgBAf;Ut=}t=176f$$?PLT|zs| zP;D88EKk9j?7n)QyMT7evS_3jUxn5>)?eRyB(&)XDqBcfoO$LO;6RRrYaO0h%)6K? zc)`oSOwT&h3vZccLyl*0)>2Ev9d#Qt2jj$l@n+37wnvc2=^rjP_Tt>tJzt`s+aTs- zRkH{e;U|_`V8I<*iBb`tM0dy<1`GJ17`7=AI*Xi>Yc1Ru&iNDSI}Om{cd_UY#WaXh zw8&ZaDTlQK!D4SJ0;7%qJ_t?29weL*C&H~GIClvi_WidP_QJS}kUQ(LtKvm?;dT?3 zwXaC3R}D>K(J-uWcl8xH_aitrsfhG;zw}xU=rL%ejIPTHF7y-Oy*hH95jbhmMz|K=Cg@0JKp$e)MGhm@j_~w}M7B5aVbO8w`XX4bAGf2%Fymhz5HVmgfVmM{v zgXt?o_~fp#_g~x4)-46y{SAgmc6BOetq6b9NbNu#ca?{UamV)5)*>qQ_BS1ay}lAT z+uYPnbw<72Yr9w`z`W(~5H{}Wen{l4>L%CZ)??o^x@cAaIBVah6(amqH_lb6`157k zUcH7j8JHPVyBEWvYhqY785fT1PciB$W0afvpQ05Va#|S2O z&!aNjnm9zuoY^(i{yO;F`8pNocwFXi|HDfzop@`t0i~_ONZFhzan&i2UDHpkBR8Vu zmTB;Kkuu&B`>=jF>iQb* zjvbkd>XFj`+)h6wOx$GjRXPnd|7;qL;8HTf`54^Kb)kEL7_m&fMtS z5u1^9H9qLD#y=dRetClhLr&4VZvkolJf!aw>arj*_+JeK)-L z2{OJ03JbS+FT$r4t8MrdM2WM$;iyR3cE8}`YgCH9Gemz7Ij2{ttx0|_S*_w_Ey7*_ z`wHc-?(J`;7F_jYFL^}h{7=JE?*Lx|I6KZ}*AwC1@tl*S(ecySIwwGH*U9~Wxd_jX z7dCL|D88xu=#JaSeGK5N0~#8Ts(3C;%6HP0|1@a@&;xwfA+}FL-Z>QyZ%Rsg%Ub{R?c>!8FhBQmF|Fh?jR>#W0y`>;X#DqAzohES%m#Xx za*o@HoFV(bp$pbhEhbNR=N^U{m_s$Ty{34GoE?2Qy##M=mXXs9@BqMB$A0grCL1oQ z4Mg2n9wzqvr{4A6fR3#*2$gvAa1Ro81_M__e_5lKuj>!b0%sXG?5jYe56|%=nKkN0 z4Cm+TTW^Oztzhuj4%EPp=XjBjezI}l)2Jdgj*%Z%4Fy#Yaat@hWfIjVnJUKJ~}~;lME@bhFHL(pgU{QgZg;oC8Wk@$v|&V}@Br*R} zUc)$gTSwbrkOUuzBrKQD_aYUqzhEMEB@2r*dd4CDt|)6WBJ;#)H+UD_cxM+;c3w5f!Jd3Q zg0I)%^{~ac5wL~#Z6)T-2o6CH(T_y=fe(0zpVGRSRB+^pnmiqeQ=O$dG!{x}HI?pv z%1b*@>y5&5z$^aQm;BLHSPP{(&p!V0k^wHBjSk56?^caS(MTNqd|j=vCO1d%<_Nr? z(XSlMY0X#K3Bq0%(f2bhXe>zBXdcn@BI+}QLT2fW5Irdoq=i32T27_UoCRs+&zeR` z%|DFBhDEJ6X*Py;zCmN~c%V6bY)+Qkfdl@4-`+rts;J<;k07YJt8q|f(lQmoN`FDP z;(^9SDJ-PIhyX!&IhDgIFnL7Nq63Ar^-ocqPsj56CxgdAa4N_saFohFP6e^;1cA*s z&I`F@yg=>Z#-Vl>Iv52SGH)CXYnYL;abOG#r2=pA=QzIg-_kTq3QaSRPt!O%;QFN@ z?U9)FgPYcwT*Y^LASkDTnWF^oyEM)gX^qm6He&*{CD#7a`O1uy4OhFWeBVB z)RX?0S!uonL-7lI*x{_hA_b)?6XfSXeCL~;i3|f4vr@!3wKzVL%~zvUHl#94H7t4iRkoPsNV;&Wum!?}I> z&PVj}tCi`>$naxgF=5lSHq5X|i`pR$%q-iNuDgpg!qt?o}Q%WiED!2VKO2akC&Gw#sQQreqEOt}J6`(UPN!IUzkIi&cV~dbttilmSRaBqv6EzV5-unIL^o~A@$qCRy}JrESUO2C5$`7}-prT` zKlvT=2V387x(Vq2o5b;7!limYxV|&)KhQfHF2braJWfCd<_agPDZ20V-bu57o{Bv_ zc5dq5S3nOxueBxbX9&tu%5%@g!&@SriUWt8-BR$@`dT(N+MV()WuM;|fx7+H&Gel=_@08dZ>n$rlTyaC^0N4VAlnCvB%K-8 zJdL%f$&yK)Ohc@>bQ&jijWz&XfVIX! z807NN&#NFes9LXxgO|W15D9%;5tpTtR3s z-Pbe4h$lO%wz*b2$s*GnWrwg6BdoWQtLsCtnBx zLIsfpMu9(cc}LS~=Nr>3NyjhvTyV3Y!Mw>TDzGO@A6g2hLcqW+hxj77_*YhtR6-&2 z9ZxflX1|d>I*^JNXuwDFg$AUzFJ61R`A81BPBLNvb^!Ytu@Wt0%{&^quGnFv%zh|h z9x8k=PZ$enRwd7y*#%?NY=ymVHmmyO6s;#StgUqXx1pgHu3I#iPrV=raOEOx0bI7I zETrPHApK=NAHlt%jCNOrw15SCD2wYDl?=CAMyUl^wtx@waZ{tg{OE0k;E^D(TnItd z?+QW8LjH9e*Es4)-a-VDkM9Z6vEf#>{Qf4C#O02N^`8oY7Yq4UIo$DRFyH=6NW(pk z`~@G>CSM*rJF++8k$MkGmB7W#XCXpXc7O)fQupZ z#Az`ENgo73*kTS>8q%904d!`TQj41?$?HTbtuo@o&5=sG*w_fLg(Iw-$cHa@N7WR9 z|H4raL>6-P$P*V#>PcoHr>z%2&MiRu+AKxyU0ujEgYXa~ID9G)c)>fQK!9r~m4&tH ztbimf;T!?M4V73HSb|zi@1l?%T*9~Pl_kizK@X$A7Yy8Csmyd&U!&B9gl@HJL^7A~ z)xaH>N?c-s5r?l&F6G-3*I(idaF{|6Q6wCwD}o?!EGa1ButH4^(Z`8t^sy;oQBITh(PNH|f;`*Kz7e%yKB6 zKgTFlk?iGsdn{Ux(!RjE7IhxbROA#=payR3R4U$sC?M4jtQ@3X5W4~yq^wp*=dTdH z6-8D3?2m2SQN#?-5u~u8+BbU?6h8}{jim1zWLR%MDOv`v;}r^CDd)E*Z|It_n6Ynp zn7-xgtr7C$uK;c5scWq41-M$&V4iwYfq1x*cQ{J|K_mtXT78}xL%5cx{zNJu7!!;F z$55S}GS7-Ji~?KoWEGt{ za0jZvyeN#Ody-Ou8&i9%=DSB471(t$3S6Wnxk3fsV;-lBrX{@VwkbhcmmV~&CHZNC zu8Gn%xIxum{%t%JMngr*HF&h_M<0F3fHnO5HJYXcC(twl!7Zv*se%;ad#i#j0A;bia;S`oZO^2J_HSEQ}64_o$#lx>4YbG~B|f gCqqloIk@pgfhAc`%5nInm)^Y7X{`3 Date: Tue, 27 Jul 2010 21:48:47 +0400 Subject: [PATCH 07/82] Rollback... Need to ensure to requests from the same alarm can execute simultaneously due to use of shared thread pool in application. --- .../platform-api/src/com/intellij/util/Alarm.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/platform/platform-api/src/com/intellij/util/Alarm.java b/platform/platform-api/src/com/intellij/util/Alarm.java index 9f4b1f78ddb6..4aafb948aa95 100644 --- a/platform/platform-api/src/com/intellij/util/Alarm.java +++ b/platform/platform-api/src/com/intellij/util/Alarm.java @@ -43,6 +43,8 @@ public class Alarm implements Disposable { private final List myRequests = new ArrayList(); private final List myPendingRequests = new ArrayList(); + private final ThreadPoolExecutor myExecutorService; + private static final ThreadPoolExecutor ourSharedExecutorService = ConcurrencyUtil.newSingleThreadExecutor("Alarm pool(shared)", Thread.NORM_PRIORITY - 2); private final Object LOCK = new Object(); @@ -53,6 +55,10 @@ public class Alarm implements Disposable { public void dispose() { myDisposed = true; cancelAllRequests(); + if (myThreadToUse == ThreadToUse.OWN_THREAD) { + myExecutorService.getQueue().clear(); + myExecutorService.shutdown(); + } } public enum ThreadToUse { @@ -78,6 +84,7 @@ public class Alarm implements Disposable { } public Alarm(@NotNull ThreadToUse threadToUse, Disposable parentDisposable) { myThreadToUse = threadToUse; + myExecutorService = threadToUse == ThreadToUse.OWN_THREAD ? ConcurrencyUtil.newSingleThreadExecutor("Alarm pool(own)", Thread.NORM_PRIORITY - 2) : ourSharedExecutorService; if (parentDisposable != null) { Disposer.register(parentDisposable, this); @@ -236,9 +243,7 @@ public class Alarm implements Disposable { } } else { - myFuture = (myThreadToUse == ThreadToUse.SHARED_THREAD) - ? ourSharedExecutorService.submit(scheduledTask) - : ApplicationManager.getApplication().executeOnPooledThread(scheduledTask); + myFuture = myExecutorService.submit(scheduledTask); } } } From b0d7d7a624a46bf8c7a55ce91ab5eadb6c4c0f31 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 26 Jul 2010 19:02:35 +0100 Subject: [PATCH 08/82] insert paired brace before the closing brace or punctuation in the custom file type --- .../psi/CustomHighlighterTokenType.java | 1 + .../custom/CustomFileTypeLexer.java | 1 + .../impl/CustomFileTypeBraceMatcher.java | 8 +++- .../custom/tokens/PunctuationParser.java | 39 +++++++++++++++++++ 4 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 platform/lang-impl/src/com/intellij/ide/highlighter/custom/tokens/PunctuationParser.java diff --git a/platform/lang-api/src/com/intellij/psi/CustomHighlighterTokenType.java b/platform/lang-api/src/com/intellij/psi/CustomHighlighterTokenType.java index 505b52cbeaa2..41ae1093e409 100644 --- a/platform/lang-api/src/com/intellij/psi/CustomHighlighterTokenType.java +++ b/platform/lang-api/src/com/intellij/psi/CustomHighlighterTokenType.java @@ -45,6 +45,7 @@ public interface CustomHighlighterTokenType { IElementType MULTI_LINE_COMMENT = new CustomElementType("MULTI_LINE_COMMENT"); IElementType WHITESPACE = new CustomElementType("WHITESPACE"); IElementType CHARACTER = new CustomElementType("CHARACTER"); + IElementType PUNCTUATION = new CustomElementType("PUNCTUATION"); IElementType L_BRACE = new CustomElementType("L_BRACE"); IElementType R_BRACE = new CustomElementType("R_BRACE"); diff --git a/platform/lang-impl/src/com/intellij/ide/highlighter/custom/CustomFileTypeLexer.java b/platform/lang-impl/src/com/intellij/ide/highlighter/custom/CustomFileTypeLexer.java index c31f41735c91..6506934c0c73 100644 --- a/platform/lang-impl/src/com/intellij/ide/highlighter/custom/CustomFileTypeLexer.java +++ b/platform/lang-impl/src/com/intellij/ide/highlighter/custom/CustomFileTypeLexer.java @@ -65,6 +65,7 @@ public final class CustomFileTypeLexer extends AbstractCustomLexer { tokenParsers.add(multilineCommentParser); } tokenParsers.add(numberParser); + tokenParsers.add(new PunctuationParser()); if (hexNumberParser != null) { tokenParsers.add(hexNumberParser); } diff --git a/platform/lang-impl/src/com/intellij/ide/highlighter/custom/impl/CustomFileTypeBraceMatcher.java b/platform/lang-impl/src/com/intellij/ide/highlighter/custom/impl/CustomFileTypeBraceMatcher.java index 1c099650b269..684ab7972e54 100644 --- a/platform/lang-impl/src/com/intellij/ide/highlighter/custom/impl/CustomFileTypeBraceMatcher.java +++ b/platform/lang-impl/src/com/intellij/ide/highlighter/custom/impl/CustomFileTypeBraceMatcher.java @@ -42,8 +42,10 @@ class CustomFileTypeBraceMatcher implements BraceMatcher { } public boolean isRBraceToken(HighlighterIterator iterator, CharSequence fileText, FileType fileType) { - final IElementType tokenType = iterator.getTokenType(); + return isRBraceToken(iterator.getTokenType()); + } + private static boolean isRBraceToken(IElementType tokenType) { return tokenType == CustomHighlighterTokenType.R_BRACKET || tokenType == CustomHighlighterTokenType.R_PARENTH || tokenType == CustomHighlighterTokenType.R_BRACE; @@ -80,7 +82,9 @@ class CustomFileTypeBraceMatcher implements BraceMatcher { } public boolean isPairedBracesAllowedBeforeType(@NotNull final IElementType lbraceType, @Nullable final IElementType contextType) { - return contextType == CustomHighlighterTokenType.WHITESPACE; + return contextType == CustomHighlighterTokenType.PUNCTUATION || + contextType == CustomHighlighterTokenType.WHITESPACE || + isRBraceToken(contextType); } public int getCodeConstructStart(final PsiFile file, final int openingBraceOffset) { diff --git a/platform/lang-impl/src/com/intellij/ide/highlighter/custom/tokens/PunctuationParser.java b/platform/lang-impl/src/com/intellij/ide/highlighter/custom/tokens/PunctuationParser.java new file mode 100644 index 000000000000..e097e4df887b --- /dev/null +++ b/platform/lang-impl/src/com/intellij/ide/highlighter/custom/tokens/PunctuationParser.java @@ -0,0 +1,39 @@ +/* + * Copyright 2000-2009 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.ide.highlighter.custom.tokens; + +import com.intellij.psi.CustomHighlighterTokenType; + +/** + * @author peter + */ +public class PunctuationParser extends BaseTokenParser { + @Override + public boolean hasToken(int position) { + final char c = myBuffer.charAt(position); + if (".,:;".indexOf(c) >= 0) { + myTokenInfo.updateData(position, position+1, CustomHighlighterTokenType.PUNCTUATION); + return true; + } + return false; + } + + @Override + public int getSmartUpdateShift() { + return 0; + } +} From 4710c4d8e55a33d2fed2a05d60cd876c2a58e7f5 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 26 Jul 2010 20:29:44 +0100 Subject: [PATCH 09/82] move the groovy constructor-resolving method to a more appropriate place --- .../gpp/GppClosureParameterTypeProvider.java | 3 ++- .../gpp/GppExpectedTypesContributor.java | 3 ++- .../plugins/groovy/gpp/GppTypeConverter.java | 18 +----------------- .../plugins/groovy/lang/psi/util/PsiUtil.java | 15 +++++++++++++++ 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppClosureParameterTypeProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppClosureParameterTypeProvider.java index 452a310bdead..47e863de80d6 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppClosureParameterTypeProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppClosureParameterTypeProvider.java @@ -19,6 +19,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpres import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.GroovyExpectedTypesProvider; import org.jetbrains.plugins.groovy.lang.psi.impl.GrTupleType; import org.jetbrains.plugins.groovy.lang.psi.impl.types.GrClosureSignatureUtil; +import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import java.util.*; @@ -49,7 +50,7 @@ public class GppClosureParameterTypeProvider extends AbstractClosureParameterEnh if (listType instanceof GrTupleType) { for (PsiType type : GroovyExpectedTypesProvider.getDefaultExpectedTypes(list)) { if (type instanceof PsiClassType) { - for (GroovyResolveResult resolveResult : GppTypeConverter + for (GroovyResolveResult resolveResult : PsiUtil .getConstructorCandidates((PsiClassType)type, ((GrTupleType)listType).getComponentTypes(), closure)) { final PsiElement method = resolveResult.getElement(); if (method instanceof PsiMethod && ((PsiMethod)method).isConstructor()) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppExpectedTypesContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppExpectedTypesContributor.java index 6266d2b15af1..5937224292b1 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppExpectedTypesContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppExpectedTypesContributor.java @@ -10,6 +10,7 @@ import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.GroovyExpectedTypesPr import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.SubtypeConstraint; import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.TypeConstraint; import org.jetbrains.plugins.groovy.lang.psi.impl.GrTupleType; +import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import java.util.ArrayList; import java.util.Arrays; @@ -48,7 +49,7 @@ public class GppExpectedTypesContributor extends GroovyExpectedTypesContributor final ArrayList result = new ArrayList(); for (PsiType type : GroovyExpectedTypesProvider.getDefaultExpectedTypes(expression)) { if (type instanceof PsiClassType) { - for (GroovyResolveResult resolveResult : GppTypeConverter.getConstructorCandidates((PsiClassType)type, argTypes, expression)) { + for (GroovyResolveResult resolveResult : PsiUtil.getConstructorCandidates((PsiClassType)type, argTypes, expression)) { final PsiElement method = resolveResult.getElement(); if (method instanceof PsiMethod && ((PsiMethod)method).isConstructor()) { final PsiParameter[] constructorParameters = ((PsiMethod)method).getParameterList().getParameters(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java index a41d82ebd46e..3a4ea0680f77 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java @@ -7,12 +7,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.dsl.toplevel.AnnotatedContextFilter; import org.jetbrains.plugins.groovy.lang.psi.GrTypeConverter; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; -import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrClosureSignature; import org.jetbrains.plugins.groovy.lang.psi.impl.GrClosureType; import org.jetbrains.plugins.groovy.lang.psi.impl.GrMapType; import org.jetbrains.plugins.groovy.lang.psi.impl.GrTupleType; -import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyResolveResultImpl; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; import org.jetbrains.plugins.groovy.lang.psi.impl.types.GrClosureSignatureUtil; @@ -93,21 +91,7 @@ public class GppTypeConverter extends GrTypeConverter { } private static boolean hasConstructor(PsiClassType lType, PsiType[] argTypes, GroovyPsiElement context) { - return getConstructorCandidates(lType, argTypes, context).length == 1; - } - - public static GroovyResolveResult[] getConstructorCandidates(PsiClassType classType, PsiType[] argTypes, GroovyPsiElement context) { - final PsiClassType.ClassResolveResult resolveResult = classType.resolveGenerics(); - final PsiClass psiClass = resolveResult.getElement(); - final PsiSubstitutor substitutor = resolveResult.getSubstitutor(); - if (psiClass == null) { - return GroovyResolveResult.EMPTY_ARRAY; - } - - final GroovyResolveResult grResult = resolveResult instanceof GroovyResolveResult - ? (GroovyResolveResult)resolveResult - : new GroovyResolveResultImpl(psiClass, context, substitutor, true, true); - return org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil.getConstructorCandidates(context, new GroovyResolveResult[]{grResult}, argTypes); + return org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil.getConstructorCandidates(lType, argTypes, context).length == 1; } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java index d1981723e78c..628b7350ce25 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java @@ -66,6 +66,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.types.GrClosureSignature; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement; import org.jetbrains.plugins.groovy.lang.psi.impl.GrClosureType; import org.jetbrains.plugins.groovy.lang.psi.impl.GrMapType; +import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyResolveResultImpl; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass; import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.JavaIdentifier; @@ -939,4 +940,18 @@ public class PsiUtil { } return (GrReferenceExpression)replaced; } + + public static GroovyResolveResult[] getConstructorCandidates(PsiClassType classType, PsiType[] argTypes, GroovyPsiElement context) { + final PsiClassType.ClassResolveResult resolveResult = classType.resolveGenerics(); + final PsiClass psiClass = resolveResult.getElement(); + final PsiSubstitutor substitutor = resolveResult.getSubstitutor(); + if (psiClass == null) { + return GroovyResolveResult.EMPTY_ARRAY; + } + + final GroovyResolveResult grResult = resolveResult instanceof GroovyResolveResult + ? (GroovyResolveResult)resolveResult + : new GroovyResolveResultImpl(psiClass, context, substitutor, true, true); + return getConstructorCandidates(context, new GroovyResolveResult[]{grResult}, argTypes); + } } From 2b4f33a1b8786c87defe36634d9fdbfd488cf971 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 26 Jul 2010 20:29:53 +0100 Subject: [PATCH 10/82] then- and else branches of groovy if may return a value from function: support this in control flow (IDEA-56628) --- .../GroovyAssignabilityCheckInspection.java | 9 ++++--- .../MissingReturnInspection.java | 7 +++-- .../utils/ControlFlowUtils.java | 13 ++++++--- .../controlFlow/impl/ControlFlowBuilder.java | 17 +++++++----- .../testdata/groovy/controlFlow/if1.test | 5 ++-- .../groovy/controlFlow/ifInstanceofElse.test | 27 ++++++++++--------- 6 files changed, 48 insertions(+), 30 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GroovyAssignabilityCheckInspection.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GroovyAssignabilityCheckInspection.java index 44b23e2aae38..f2be2a783d20 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GroovyAssignabilityCheckInspection.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GroovyAssignabilityCheckInspection.java @@ -21,6 +21,7 @@ import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.TypeConversionUtil; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.GroovyBundle; import org.jetbrains.plugins.groovy.codeInspection.BaseInspection; import org.jetbrains.plugins.groovy.codeInspection.BaseInspectionVisitor; @@ -94,10 +95,10 @@ public class GroovyAssignabilityCheckInspection extends BaseInspection { if (expectedType == null || PsiType.VOID.equals(expectedType)) return; ControlFlowUtils.visitAllExitPoints(block, new ControlFlowUtils.ExitPointVisitor() { - public boolean visit(Instruction instruction) { - final PsiElement psiElement = instruction.getElement(); - if (psiElement instanceof GrExpression) { - checkAssignability(expectedType, (GrExpression)psiElement, (GrExpression)psiElement); + @Override + public boolean visitExitPoint(Instruction instruction, @Nullable GrExpression returnValue) { + if (returnValue != null && !(returnValue.getParent() instanceof GrReturnStatement)) { + checkAssignability(expectedType, returnValue, returnValue); } return true; } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/noReturnMethod/MissingReturnInspection.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/noReturnMethod/MissingReturnInspection.java index 684dbfe780ac..a39ba6cc3fee 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/noReturnMethod/MissingReturnInspection.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/noReturnMethod/MissingReturnInspection.java @@ -24,6 +24,7 @@ import com.intellij.psi.PsiType; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.codeInspection.GroovyInspectionBundle; import org.jetbrains.plugins.groovy.codeInspection.GroovySuppressableInspectionTool; import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils; @@ -35,6 +36,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrOpenBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.branch.GrAssertStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.branch.GrReturnStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.branch.GrThrowStatement; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; import org.jetbrains.plugins.groovy.lang.psi.controlFlow.Instruction; import org.jetbrains.plugins.groovy.lang.psi.controlFlow.impl.MaybeReturnInstruction; @@ -86,7 +88,8 @@ public class MissingReturnInspection extends GroovySuppressableInspectionTool { final Ref hasExplicitReturn = new Ref(false); final Ref sometimes = new Ref(false); ControlFlowUtils.visitAllExitPoints(block, new ControlFlowUtils.ExitPointVisitor() { - public boolean visit(Instruction instruction) { + @Override + public boolean visitExitPoint(Instruction instruction, @Nullable GrExpression returnValue) { if (instruction instanceof MaybeReturnInstruction) { if (((MaybeReturnInstruction)instruction).mayReturnValue()) { sometimes.set(true); @@ -99,7 +102,7 @@ public class MissingReturnInspection extends GroovySuppressableInspectionTool { final PsiElement element = instruction.getElement(); if (element instanceof GrReturnStatement) { sometimes.set(true); - if (((GrReturnStatement)element).getReturnValue() != null) { + if (returnValue != null) { hasExplicitReturn.set(true); } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/utils/ControlFlowUtils.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/utils/ControlFlowUtils.java index 86aa6c0503e4..995b0302494d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/utils/ControlFlowUtils.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/utils/ControlFlowUtils.java @@ -543,7 +543,7 @@ public class ControlFlowUtils { public interface ExitPointVisitor { - boolean visit(Instruction instruction); + boolean visitExitPoint(Instruction instruction, @Nullable GrExpression returnValue); } public static void visitAllExitPoints(@Nullable GrCodeBlock block, ExitPointVisitor visitor) { @@ -556,12 +556,16 @@ public class ControlFlowUtils { private static boolean visitAllExitPointsInner(Instruction last, Instruction first, boolean[] visited, ExitPointVisitor visitor) { if (first == last) return true; if (last instanceof MaybeReturnInstruction) { - return visitor.visit(last); + return visitor.visitExitPoint(last, (GrExpression)last.getElement()); } - final PsiElement element = last.getElement(); + PsiElement element = last.getElement(); if (element != null) { - return visitor.visit(last); + if (element instanceof GrReturnStatement) { + element = ((GrReturnStatement)element).getReturnValue(); + } + + return visitor.visitExitPoint(last, element instanceof GrExpression ? (GrExpression)element : null); } visited[last.num()] = true; for (Instruction pred : last.allPred()) { @@ -571,4 +575,5 @@ public class ControlFlowUtils { } return true; } + } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/impl/ControlFlowBuilder.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/impl/ControlFlowBuilder.java index ea85bc7a40b1..174ac80aa94e 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/impl/ControlFlowBuilder.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/impl/ControlFlowBuilder.java @@ -107,16 +107,19 @@ public class ControlFlowBuilder extends GroovyRecursiveElementVisitor { if (!(block.getParent() instanceof GrBlockStatement && block.getParent().getParent() instanceof GrLoopStatement)) { final GrStatement[] statements = block.getStatements(); if (statements.length > 0) { - final GrStatement last = statements[statements.length - 1]; - if (last instanceof GrExpression) { - final MaybeReturnInstruction instruction = new MaybeReturnInstruction((GrExpression)last, myInstructionNumber++); - checkPending(instruction); - addNode(instruction); - } + handlePossibleReturn(statements[statements.length - 1]); } } } + private void handlePossibleReturn(GrStatement last) { + if (last instanceof GrExpression) { + final MaybeReturnInstruction instruction = new MaybeReturnInstruction((GrExpression)last, myInstructionNumber++); + checkPending(instruction); + addNode(instruction); + } + } + public Instruction[] buildControlFlow(GroovyPsiElement scope, GroovyPsiElement startInScope, GroovyPsiElement endInScope) { myInstructions = new ArrayList(); myProcessingStack = new Stack(); @@ -386,6 +389,7 @@ public class ControlFlowBuilder extends GroovyRecursiveElementVisitor { condition.accept(this); } thenBranch.accept(this); + handlePossibleReturn(thenBranch); addPendingEdge(ifStatement, myHead); } @@ -402,6 +406,7 @@ public class ControlFlowBuilder extends GroovyRecursiveElementVisitor { final GrStatement elseBranch = ifStatement.getElseBranch(); if (elseBranch != null) { elseBranch.accept(this); + handlePossibleReturn(elseBranch); addPendingEdge(ifStatement, myHead); } diff --git a/plugins/groovy/testdata/groovy/controlFlow/if1.test b/plugins/groovy/testdata/groovy/controlFlow/if1.test index a88e8969eb44..f4dc6626de6c 100644 --- a/plugins/groovy/testdata/groovy/controlFlow/if1.test +++ b/plugins/groovy/testdata/groovy/controlFlow/if1.test @@ -7,6 +7,7 @@ if (true) { 0(1) element: null 1(2,4) element: IF statement 2(3) WRITE a -3(5) element: Assignment expression MAYBE_RETURN +3(6) element: Assignment expression MAYBE_RETURN 4(5) WRITE a -5() element: null \ No newline at end of file +5(6) element: Assignment expression MAYBE_RETURN +6() element: null \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/controlFlow/ifInstanceofElse.test b/plugins/groovy/testdata/groovy/controlFlow/ifInstanceofElse.test index 7851696d58a6..e1f89d70302f 100644 --- a/plugins/groovy/testdata/groovy/controlFlow/ifInstanceofElse.test +++ b/plugins/groovy/testdata/groovy/controlFlow/ifInstanceofElse.test @@ -3,17 +3,20 @@ else if (!(o instanceof Integer)) b = 2 else b = 3 ----- 0(1) element: null -1(2,5) element: IF statement +1(2,6) element: IF statement 2(3) READ o 3(4) assertion: o instanceof String -4(14) WRITE b -5(6) READ o -6(7) assertion: ! o instanceof String -7(8,11) element: IF statement -8(9) READ o -9(10) assertion: ! o instanceof Integer -10(14) WRITE b -11(12) READ o -12(13) assertion: o instanceof Integer -13(14) WRITE b -14() element: null \ No newline at end of file +4(5) WRITE b +5(17) element: Assignment expression MAYBE_RETURN +6(7) READ o +7(8) assertion: ! o instanceof String +8(9,13) element: IF statement +9(10) READ o +10(11) assertion: ! o instanceof Integer +11(12) WRITE b +12(17) element: Assignment expression MAYBE_RETURN +13(14) READ o +14(15) assertion: o instanceof Integer +15(16) WRITE b +16(17) element: Assignment expression MAYBE_RETURN +17() element: null \ No newline at end of file From 97e94473315954c3f84fc9434466c8ba7f3acc40 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 26 Jul 2010 20:30:17 +0100 Subject: [PATCH 11/82] PsiReferenceBase.createSelfReference(PsiElement, PsiElement, TextRange) --- .../com/intellij/psi/PsiReferenceBase.java | 59 ++++++++++++++----- 1 file changed, 43 insertions(+), 16 deletions(-) diff --git a/platform/lang-api/src/com/intellij/psi/PsiReferenceBase.java b/platform/lang-api/src/com/intellij/psi/PsiReferenceBase.java index 4e527134996f..a2840604b3c3 100644 --- a/platform/lang-api/src/com/intellij/psi/PsiReferenceBase.java +++ b/platform/lang-api/src/com/intellij/psi/PsiReferenceBase.java @@ -107,23 +107,11 @@ public abstract class PsiReferenceBase implements PsiRefer } public static PsiReferenceBase createSelfReference(T element, final PsiElement resolveTo) { + return new Immediate(element, true, resolveTo); + } - return new PsiReferenceBase(element,true) { - //do nothing. the element will be renamed via PsiMetaData (com.intellij.refactoring.rename.RenameUtil.doRenameGenericNamedElement()) - public PsiElement handleElementRename(final String newElementName) throws IncorrectOperationException { - return getElement(); - } - - @Nullable - public PsiElement resolve() { - return resolveTo; - } - - @NotNull - public Object[] getVariants() { - return EMPTY_ARRAY; - } - }; + public static PsiReferenceBase createSelfReference(T element, TextRange range, final PsiElement resolveTo) { + return new Immediate(element, range, resolveTo); } @Nullable @@ -165,4 +153,43 @@ public abstract class PsiReferenceBase implements PsiRefer return resolveResults.length == 1 ? resolveResults[0].getElement() : null; } } + + public static class Immediate extends PsiReferenceBase { + private final PsiElement myResolveTo; + + public Immediate(T element, TextRange range, boolean soft, PsiElement resolveTo) { + super(element, range, soft); + myResolveTo = resolveTo; + } + + public Immediate(T element, TextRange range, PsiElement resolveTo) { + super(element, range); + myResolveTo = resolveTo; + } + + public Immediate(T element, boolean soft, PsiElement resolveTo) { + super(element, soft); + myResolveTo = resolveTo; + } + + public Immediate(@NotNull T element, PsiElement resolveTo) { + super(element); + myResolveTo = resolveTo; + } + + //do nothing. the element will be renamed via PsiMetaData (com.intellij.refactoring.rename.RenameUtil.doRenameGenericNamedElement()) + public PsiElement handleElementRename(final String newElementName) throws IncorrectOperationException { + return getElement(); + } + + @Nullable + public PsiElement resolve() { + return myResolveTo; + } + + @NotNull + public Object[] getVariants() { + return EMPTY_ARRAY; + } + } } From a7a5dbaa7a236482700cb5c9a9ae87a60f5658f7 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 26 Jul 2010 20:31:05 +0100 Subject: [PATCH 12/82] find Groovy list2object conversions as constructor usages --- .../GroovyConstructorUsagesSearchHelper.java | 110 +++++++++++++++--- .../lang/LiteralConstructorUsagesTest.groovy | 47 ++++++++ 2 files changed, 140 insertions(+), 17 deletions(-) create mode 100644 plugins/groovy/test/org/jetbrains/plugins/groovy/lang/LiteralConstructorUsagesTest.groovy diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java index d3ea103a2b8e..9a46dcfc2899 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java @@ -28,18 +28,30 @@ import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.searches.DirectClassInheritorsSearch; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.util.Processor; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.GroovyFileType; +import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; +import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrConstructorInvocation; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrOpenBlock; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrNewExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrSafeCastExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrTypeCastExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrAnonymousClassDefinition; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstant; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement; +import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeElement; +import org.jetbrains.plugins.groovy.lang.psi.controlFlow.Instruction; +import org.jetbrains.plugins.groovy.lang.psi.impl.GrTupleType; +import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; /** * @author Maxim.Medvedev @@ -88,22 +100,7 @@ public class GroovyConstructorUsagesSearchHelper { ReferencesSearch.search(clazz, searchScope, true).forEach(new ReadActionProcessor() { @Override public boolean processInReadAction(PsiReference ref) { - final PsiElement element = ref.getElement(); - if (element instanceof GrCodeReferenceElement) { - GrNewExpression newExpression = null; - if (element.getParent() instanceof GrNewExpression) { - newExpression = (GrNewExpression)element.getParent(); - } - else if (element.getParent() instanceof GrAnonymousClassDefinition) { - newExpression = (GrNewExpression)element.getParent().getParent(); - } - if (newExpression != null) { - final PsiMethod resolvedConstructor = newExpression.resolveConstructor(); - final PsiManager manager = constructor.getManager(); - if (manager.areElementsEquivalent(resolvedConstructor, constructor) && !consumer.process(ref)) return false; - } - } - return true; + return processClassReference(ref, constructor, consumer); } }); @@ -128,6 +125,85 @@ public class GroovyConstructorUsagesSearchHelper { return true; } + private static boolean processClassReference(PsiReference ref, final PsiMethod constructor, final Processor consumer) { + final PsiElement element = ref.getElement(); + if (!(element instanceof GrCodeReferenceElement)) { + return true; + } + + final PsiElement parent = element.getParent(); + if (parent instanceof GrNewExpression) { + final PsiMethod resolvedConstructor = ((GrNewExpression)parent).resolveConstructor(); + if (constructor.getManager().areElementsEquivalent(resolvedConstructor, constructor) && !consumer.process(ref)) { + return false; + } + } + else if (parent instanceof GrTypeElement) { + final GrTypeElement typeElement = (GrTypeElement)parent; + + final PsiElement grandpa = typeElement.getParent(); + if (grandpa instanceof GrVariableDeclaration) { + final GrVariable[] vars = ((GrVariableDeclaration)grandpa).getVariables(); + if (vars.length == 1) { + final GrVariable variable = vars[0]; + if (!checkListInstantiation(constructor, consumer, variable.getInitializerGroovy(), typeElement)) { + return false; + } + } + } + else if (grandpa instanceof GrMethod) { + final GrMethod method = (GrMethod)grandpa; + if (typeElement == method.getReturnTypeElementGroovy()) { + ControlFlowUtils.visitAllExitPoints(method.getBlock(), new ControlFlowUtils.ExitPointVisitor() { + @Override + public boolean visitExitPoint(Instruction instruction, @Nullable GrExpression returnValue) { + if (!checkListInstantiation(constructor, consumer, returnValue, typeElement)) { + return false; + } + return true; + } + }); + } + } + else if (grandpa instanceof GrTypeCastExpression) { + final GrTypeCastExpression cast = (GrTypeCastExpression)grandpa; + if (cast.getCastTypeElement() == typeElement && !checkListInstantiation(constructor, consumer, cast.getOperand(), typeElement)) { + return false; + } + } + else if (grandpa instanceof GrSafeCastExpression) { + final GrSafeCastExpression cast = (GrSafeCastExpression)grandpa; + if (cast.getCastTypeElement() == typeElement && !checkListInstantiation(constructor, consumer, cast.getOperand(), typeElement)) { + return false; + } + } + } + return true; + } + + private static boolean checkListInstantiation(PsiMethod constructor, + Processor consumer, + GrExpression expression, final GrTypeElement typeElement) { + if (expression instanceof GrListOrMap) { + final GrListOrMap list = (GrListOrMap)expression; + if (!list.isMap()) { + final PsiType expectedType = typeElement.getType(); + final PsiType listType = list.getType(); + if (listType instanceof GrTupleType && expectedType instanceof PsiClassType) { + final GroovyResolveResult[] candidates = PsiUtil.getConstructorCandidates((PsiClassType)expectedType, ((GrTupleType)listType).getComponentTypes(), list); + for (GroovyResolveResult candidate : candidates) { + if (constructor.getManager().areElementsEquivalent(candidate.getElement(), constructor)) { + if (!consumer.process(PsiReferenceBase.createSelfReference(list, TextRange.from(0, list.getTextLength()), constructor))) { + return false; + } + } + } + } + } + } + return true; + } + private static boolean processConstructors(final PsiMethod constructor, final Processor consumer, final PsiClass clazz, final boolean processThisRefs) { return ApplicationManager.getApplication().runReadAction(new Computable() { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/LiteralConstructorUsagesTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/LiteralConstructorUsagesTest.groovy new file mode 100644 index 000000000000..f6e6df14f708 --- /dev/null +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/LiteralConstructorUsagesTest.groovy @@ -0,0 +1,47 @@ +package org.jetbrains.plugins.groovy.lang + +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase +import com.intellij.psi.search.searches.ReferencesSearch + +/** + * @author peter + */ +class LiteralConstructorUsagesTest extends LightCodeInsightFixtureTestCase { + + public void testListVariable() throws Exception { + def foo = myFixture.addClass("""class Foo { + Foo() {} + } +""") + myFixture.addFileToProject "a.groovy", "Foo x = []" + assertOneElement(ReferencesSearch.search(foo.constructors[0]).findAll()) + } + + public void testListReturnValue() throws Exception { + def foo = myFixture.addClass("""class Foo { + Foo() {} + } +""") + myFixture.addFileToProject "a.groovy", "Foo foo() { if (true) [] else return [] }" + assertEquals(2, ReferencesSearch.search(foo.constructors[0]).findAll().size()) + } + + public void testListCast() throws Exception { + def foo = myFixture.addClass("""class Foo { + Foo() {} + } +""") + myFixture.addFileToProject "a.groovy", "def x = (Foo) []" + assertOneElement(ReferencesSearch.search(foo.constructors[0]).findAll()) + } + + public void testListAsCast() throws Exception { + def foo = myFixture.addClass("""class Foo { + Foo() {} + } +""") + myFixture.addFileToProject "a.groovy", "def x = [] as Foo" + assertOneElement(ReferencesSearch.search(foo.constructors[0]).findAll()) + } + +} From e9f04b058455c78adccfab5c9b941f975a568b89 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 26 Jul 2010 23:17:13 +0100 Subject: [PATCH 13/82] index groovy package annotations --- .../findUsages/AnnotatedMembersSearcher.java | 56 ++++++++++----- .../packaging/GrPackageDefinition.java | 10 ++- .../impl/GroovyDirectInheritorsSearcher.java | 35 +++++++++- .../packaging/GrPackageDefinitionImpl.java | 14 ++++ .../groovy/lang/psi/stubs/GrFileStub.java | 56 +++++++++++++-- .../groovy/lang/psi/stubs/GrStubUtils.java | 18 ++++- .../lang/psi/stubs/GroovyFileStubBuilder.java | 3 +- .../stubs/elements/GrFieldElementType.java | 23 +----- .../stubs/elements/GrMethodElementType.java | 40 +++-------- .../stubs/elements/GrStubFileElementType.java | 12 +++- .../elements/GrTypeDefinitionElementType.java | 3 +- .../lang/psi/stubs/impl/GrFileStubImpl.java | 63 ----------------- .../stubs/index/GrAnnotatedMemberIndex.java | 8 +-- .../groovy/lang/stubs/GroovyCacheUtil.java | 70 ------------------- 14 files changed, 182 insertions(+), 229 deletions(-) delete mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/impl/GrFileStubImpl.java delete mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/lang/stubs/GroovyCacheUtil.java diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/AnnotatedMembersSearcher.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/AnnotatedMembersSearcher.java index 3a4b9ecfc1d0..ead9e3f235d3 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/AnnotatedMembersSearcher.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/AnnotatedMembersSearcher.java @@ -21,25 +21,49 @@ 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.stubs.StubIndex; import com.intellij.util.Processor; import com.intellij.util.QueryExecutor; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.GroovyRecursiveElementVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMember; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; -import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass; -import org.jetbrains.plugins.groovy.lang.stubs.GroovyCacheUtil; +import org.jetbrains.plugins.groovy.lang.psi.stubs.index.GrAnnotatedMemberIndex; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.List; /** * @author ven */ -public class AnnotatedMembersSearcher implements QueryExecutor { +public class AnnotatedMembersSearcher implements QueryExecutor { - public boolean execute(final AnnotatedElementsSearch.Parameters p, final Processor consumer) { + @NotNull + private static List getAnnotatedMemberCandidates(PsiClass clazz, GlobalSearchScope scope) { + final String name = clazz.getName(); + if (name == null) return Collections.emptyList(); + final Collection members = StubIndex.getInstance().get(GrAnnotatedMemberIndex.KEY, name, clazz.getProject(), scope); + if (members.isEmpty()) { + return Collections.emptyList(); + } + + final ArrayList result = new ArrayList(); + for (PsiElement element : members) { + if (element instanceof GroovyFile) { + element = ((GroovyFile)element).getPackageDefinition(); + } + if (element instanceof PsiModifierListOwner) { + result.add((PsiModifierListOwner)element); + } + } + return result; + } + + public boolean execute(final AnnotatedElementsSearch.Parameters p, final Processor consumer) { final PsiClass annClass = p.getAnnotationClass(); assert annClass.isAnnotationType() : "Annotation type should be passed to annotated members search"; @@ -48,29 +72,27 @@ public class AnnotatedMembersSearcher implements QueryExecutor candidates; if (scope instanceof GlobalSearchScope) { - candidates = GroovyCacheUtil.getAnnotatedMemberCandidates(annClass, ((GlobalSearchScope)scope)); + candidates = getAnnotatedMemberCandidates(annClass, ((GlobalSearchScope)scope)); } else { - PsiElement[] elements = ((LocalSearchScope)scope).getScope(); - final List collector = new ArrayList(); - for (PsiElement element : elements) { + candidates = new ArrayList(); + for (PsiElement element : ((LocalSearchScope)scope).getScope()) { if (element instanceof GroovyPsiElement) { ((GroovyPsiElement)element).accept(new GroovyRecursiveElementVisitor() { public void visitMethod(GrMethod method) { - collector.add(method); + candidates.add(method); } public void visitField(GrField field) { - collector.add(field); + candidates.add(field); } }); } } - candidates = collector.toArray(new PsiMember[collector.size()]); } - for (PsiMember candidate : candidates) { + for (PsiModifierListOwner candidate : candidates) { if (!AnnotatedElementsSearcher.isInstanceof(candidate, p.getTypes())) { continue; } @@ -78,10 +100,8 @@ public class AnnotatedMembersSearcher implements QueryExecutor inheritors = new ArrayList(); + final Collection refLists = StubIndex.getInstance().get(GrDirectInheritorsIndex.KEY, name, clazz.getProject(), scope); + for (GrReferenceList list : refLists) { + final PsiElement parent = list.getParent(); + if (parent instanceof GrTypeDefinition) { + inheritors.add(GrClassSubstitutor.getSubstitutedClass(((GrTypeDefinition)parent))); + } + } + final Collection classes = + StubIndex.getInstance().get(GrAnonymousClassIndex.KEY, name, clazz.getProject(), scope); + for (GrAnonymousClassDefinition aClass : classes) { + inheritors.add(aClass); + } + return inheritors.toArray(new PsiClass[inheritors.size()]); + } + public boolean execute(DirectClassInheritorsSearch.SearchParameters queryParameters, final Processor consumer) { final PsiClass clazz = queryParameters.getClassToProcess(); final SearchScope scope = queryParameters.getScope(); @@ -39,7 +70,7 @@ class GroovyDirectInheritorsSearcher implements QueryExecutor() { public PsiClass[] compute() { if (!clazz.isValid()) return PsiClass.EMPTY_ARRAY; - return GroovyCacheUtil.getDeriverCandidates(clazz, (GlobalSearchScope)scope); + return getDeriverCandidates(clazz, (GlobalSearchScope)scope); } }); for (final PsiClass candidate : candidates) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/toplevel/packaging/GrPackageDefinitionImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/toplevel/packaging/GrPackageDefinitionImpl.java index 55acc71f0f34..3041aa24363c 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/toplevel/packaging/GrPackageDefinitionImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/toplevel/packaging/GrPackageDefinitionImpl.java @@ -17,6 +17,9 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.toplevel.packaging; import com.intellij.lang.ASTNode; +import com.intellij.psi.Modifier; +import com.intellij.psi.PsiModifierList; +import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; @@ -56,4 +59,15 @@ public class GrPackageDefinitionImpl extends GroovyPsiElementImpl implements GrP public GrModifierList getAnnotationList() { return (GrModifierList)findChildByType(GroovyElementTypes.MODIFIERS); } + + @Override + public PsiModifierList getModifierList() { + return getAnnotationList(); + } + + @Override + public boolean hasModifierProperty(@Modifier @NonNls @NotNull String name) { + final PsiModifierList list = getModifierList(); + return list != null && list.hasExplicitModifier(name); + } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrFileStub.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrFileStub.java index 0cf2e750f5aa..454c280d7bdc 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrFileStub.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrFileStub.java @@ -15,17 +15,63 @@ */ package org.jetbrains.plugins.groovy.lang.psi.stubs; -import com.intellij.psi.stubs.PsiFileStub; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.stubs.PsiFileStubImpl; +import com.intellij.psi.tree.IStubFileElementType; +import com.intellij.util.ArrayUtil; import com.intellij.util.io.StringRef; +import org.jetbrains.plugins.groovy.lang.parser.GroovyParserDefinition; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; +import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.packaging.GrPackageDefinition; +import org.jetbrains.plugins.groovy.lang.psi.stubs.elements.GrTypeDefinitionElementType; /** * @author ilyas */ -public interface GrFileStub extends PsiFileStub { - StringRef getPackageName(); +public class GrFileStub extends PsiFileStubImpl { + private final String[] myAnnotations; + private final StringRef myPackageName; + private final StringRef myName; + private final boolean isScript; - StringRef getName(); + public GrFileStub(GroovyFile file) { + super(file); + myPackageName = StringRef.fromString(file.getPackageName()); + myName = StringRef.fromString(StringUtil.trimEnd(file.getName(), ".groovy")); + isScript = file.isScript(); + final GrPackageDefinition definition = file.getPackageDefinition(); + if (definition != null) { + myAnnotations = GrTypeDefinitionElementType.getAnnotationNames(definition); + } else { + myAnnotations = ArrayUtil.EMPTY_STRING_ARRAY; + } + } - boolean isScript(); + public GrFileStub(StringRef packName, StringRef name, boolean isScript, String[] annotations) { + super(null); + myPackageName = packName; + myName = name; + this.isScript = isScript; + myAnnotations = annotations; + } + + public IStubFileElementType getType() { + return GroovyParserDefinition.GROOVY_FILE; + } + + public StringRef getPackageName() { + return myPackageName; + } + + public StringRef getName() { + return myName; + } + + public boolean isScript() { + return isScript; + } + + public String[] getAnnotations() { + return myAnnotations; + } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrStubUtils.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrStubUtils.java index 7a5d0c4fb816..9ecbce673657 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrStubUtils.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrStubUtils.java @@ -58,5 +58,21 @@ public class GrStubUtils { dataStream.writeUTF(namepParameter); } } - } + } + + public static void writeStringArray(StubOutputStream dataStream, String[] array) throws IOException { + dataStream.writeByte(array.length); + for (String s : array) { + dataStream.writeName(s); + } + } + + public static String[] readStringArray(StubInputStream dataStream) throws IOException { + final byte b = dataStream.readByte(); + final String[] annNames = new String[b]; + for (int i = 0; i < b; i++) { + annNames[i] = dataStream.readName().toString(); + } + return annNames; + } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GroovyFileStubBuilder.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GroovyFileStubBuilder.java index 902f4b0cef96..53aa5f33101a 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GroovyFileStubBuilder.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GroovyFileStubBuilder.java @@ -19,7 +19,6 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.stubs.DefaultStubBuilder; import com.intellij.psi.stubs.StubElement; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; -import org.jetbrains.plugins.groovy.lang.psi.stubs.impl.GrFileStubImpl; /** * @author ilyas @@ -27,7 +26,7 @@ import org.jetbrains.plugins.groovy.lang.psi.stubs.impl.GrFileStubImpl; public class GroovyFileStubBuilder extends DefaultStubBuilder { protected StubElement createStubForFile(final PsiFile file) { if (file instanceof GroovyFile && ((GroovyFile) file).isScript()) { - return new GrFileStubImpl((GroovyFile)file); + return new GrFileStub((GroovyFile)file); } return super.createStubForFile(file); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrFieldElementType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrFieldElementType.java index b909c710c179..1fe39965b9f0 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrFieldElementType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrFieldElementType.java @@ -21,16 +21,10 @@ import com.intellij.psi.stubs.IndexSink; import com.intellij.psi.stubs.StubElement; import com.intellij.psi.stubs.StubInputStream; import com.intellij.psi.stubs.StubOutputStream; -import com.intellij.util.ArrayUtil; -import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.io.StringRef; -import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GrStubElementType; -import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; -import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotation; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; -import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.GrFieldImpl; import org.jetbrains.plugins.groovy.lang.psi.stubs.GrFieldStub; import org.jetbrains.plugins.groovy.lang.psi.stubs.impl.GrFieldStubImpl; @@ -64,22 +58,7 @@ public class GrFieldElementType extends GrStubElementType } public GrFieldStub createStub(GrField psi, StubElement parentStub) { - final GrModifierList modifiers = psi.getModifierList(); - String[] annNames; - if (modifiers == null) { - annNames = ArrayUtil.EMPTY_STRING_ARRAY; - } - else { - final GrAnnotation[] annotations = modifiers.getAnnotations(); - annNames = ContainerUtil.map(annotations, new Function() { - @Nullable - public String fun(final GrAnnotation grAnnotation) { - final GrCodeReferenceElement element = grAnnotation.getClassReference(); - if (element == null) return null; - return element.getReferenceName(); - } - }, new String[annotations.length]); - } + String[] annNames = GrTypeDefinitionElementType.getAnnotationNames(psi); Set[] namedParametersArray = new Set[0]; if (psi instanceof GrFieldImpl){ diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrMethodElementType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrMethodElementType.java index 94504b059250..c242f4fe2245 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrMethodElementType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrMethodElementType.java @@ -20,15 +20,9 @@ import com.intellij.psi.stubs.IndexSink; import com.intellij.psi.stubs.StubElement; import com.intellij.psi.stubs.StubInputStream; import com.intellij.psi.stubs.StubOutputStream; -import com.intellij.util.Function; -import com.intellij.util.containers.ContainerUtil; import com.intellij.util.io.StringRef; -import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GrStubElementType; -import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; -import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotation; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; -import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.typedef.members.GrMethodImpl; import org.jetbrains.plugins.groovy.lang.psi.stubs.GrMethodStub; import org.jetbrains.plugins.groovy.lang.psi.stubs.GrStubUtils; @@ -37,7 +31,9 @@ import org.jetbrains.plugins.groovy.lang.psi.stubs.index.GrAnnotatedMemberIndex; import org.jetbrains.plugins.groovy.lang.psi.stubs.index.GrMethodNameIndex; import java.io.IOException; -import java.util.*; +import java.util.HashSet; +import java.util.List; +import java.util.Set; /** * @author ilyas @@ -57,42 +53,22 @@ public class GrMethodElementType extends GrStubElementType() { - @Nullable - public String fun(final GrAnnotation grAnnotation) { - final GrCodeReferenceElement element = grAnnotation.getClassReference(); - if (element == null) return null; - return element.getReferenceName(); - } - }, new String[annotations.length]); - Set[] namedParametersArray; - namedParametersArray = psi.getNamedParametersArray(); - - return new GrMethodStubImpl(parentStub, StringRef.fromString(psi.getName()), annNames, namedParametersArray); + return new GrMethodStubImpl(parentStub, StringRef.fromString(psi.getName()), GrTypeDefinitionElementType.getAnnotationNames(psi), + psi.getNamedParametersArray()); } public void serialize(GrMethodStub stub, StubOutputStream dataStream) throws IOException { dataStream.writeName(stub.getName()); - final String[] annotations = stub.getAnnotations(); - dataStream.writeByte(annotations.length); - for (String s : annotations) { - dataStream.writeName(s); - } + GrStubUtils.writeStringArray(dataStream, stub.getAnnotations()); final Set[] namedParameters = stub.getNamedParameters(); GrStubUtils.serializeCollectionsArray(dataStream, namedParameters); } - + public GrMethodStub deserialize(StubInputStream dataStream, StubElement parentStub) throws IOException { StringRef ref = dataStream.readName(); - final byte b = dataStream.readByte(); - final String[] annNames = new String[b]; - for (int i = 0; i < b; i++) { - annNames[i] = dataStream.readName().toString(); - } + final String[] annNames = GrStubUtils.readStringArray(dataStream); final List> namedParametersSets = GrStubUtils.deserializeCollectionsArray(dataStream); return new GrMethodStubImpl(parentStub, ref, annNames, namedParametersSets.toArray(new HashSet[0])); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrStubFileElementType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrStubFileElementType.java index 70a7da0e41a1..3dd1dec6fc2e 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrStubFileElementType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrStubFileElementType.java @@ -21,8 +21,9 @@ import com.intellij.psi.stubs.*; import com.intellij.psi.tree.IStubFileElementType; import com.intellij.util.io.StringRef; import org.jetbrains.plugins.groovy.lang.psi.stubs.GrFileStub; +import org.jetbrains.plugins.groovy.lang.psi.stubs.GrStubUtils; import org.jetbrains.plugins.groovy.lang.psi.stubs.GroovyFileStubBuilder; -import org.jetbrains.plugins.groovy.lang.psi.stubs.impl.GrFileStubImpl; +import org.jetbrains.plugins.groovy.lang.psi.stubs.index.GrAnnotatedMemberIndex; import org.jetbrains.plugins.groovy.lang.psi.stubs.index.GrFullScriptNameIndex; import org.jetbrains.plugins.groovy.lang.psi.stubs.index.GrScriptClassNameIndex; @@ -43,7 +44,7 @@ public class GrStubFileElementType extends IStubFileElementType { @Override public int getStubVersion() { - return super.getStubVersion() + 5; + return super.getStubVersion() + 6; } public String getExternalId() { @@ -60,6 +61,7 @@ public class GrStubFileElementType extends IStubFileElementType { dataStream.writeName(stub.getPackageName().toString()); dataStream.writeName(stub.getName().toString()); dataStream.writeBoolean(stub.isScript()); + GrStubUtils.writeStringArray(dataStream, stub.getAnnotations()); } @Override @@ -67,7 +69,7 @@ public class GrStubFileElementType extends IStubFileElementType { StringRef packName = dataStream.readName(); StringRef name = dataStream.readName(); boolean isScript = dataStream.readBoolean(); - return new GrFileStubImpl(packName, name, isScript); + return new GrFileStub(packName, name, isScript, GrStubUtils.readStringArray(dataStream)); } public void indexStub(GrFileStub stub, IndexSink sink) { @@ -78,6 +80,10 @@ public class GrStubFileElementType extends IStubFileElementType { final String fqn = pName == null || pName.length() == 0 ? name : pName + "." + name; sink.occurrence(GrFullScriptNameIndex.KEY, fqn.hashCode()); } + + for (String anno : stub.getAnnotations()) { + sink.occurrence(GrAnnotatedMemberIndex.KEY, anno); + } } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrTypeDefinitionElementType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrTypeDefinitionElementType.java index 5cb77de6737b..3caa45dfa5f4 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrTypeDefinitionElementType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrTypeDefinitionElementType.java @@ -17,6 +17,7 @@ package org.jetbrains.plugins.groovy.lang.psi.stubs.elements; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiModifierList; +import com.intellij.psi.PsiModifierListOwner; import com.intellij.psi.PsiNameHelper; import com.intellij.psi.impl.java.stubs.index.JavaFullClassNameIndex; import com.intellij.psi.impl.java.stubs.index.JavaShortClassNameIndex; @@ -59,7 +60,7 @@ public abstract class GrTypeDefinitionElementType annoNames = CollectionFactory.arrayList(); final PsiModifierList modifierList = psi.getModifierList(); if (modifierList instanceof GrModifierList) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/impl/GrFileStubImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/impl/GrFileStubImpl.java deleted file mode 100644 index 6a810c1247ec..000000000000 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/impl/GrFileStubImpl.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2000-2009 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.groovy.lang.psi.stubs.impl; - -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.stubs.PsiFileStubImpl; -import com.intellij.psi.tree.IStubFileElementType; -import com.intellij.util.io.StringRef; -import org.jetbrains.plugins.groovy.lang.parser.GroovyParserDefinition; -import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; -import org.jetbrains.plugins.groovy.lang.psi.stubs.GrFileStub; - -/** - * @author ilyas - */ -public class GrFileStubImpl extends PsiFileStubImpl implements GrFileStub { - private final StringRef myPackageName; - private final StringRef myName; - private final boolean isScript; - - public GrFileStubImpl(GroovyFile file) { - super(file); - myPackageName = StringRef.fromString(file.getPackageName()); - myName = StringRef.fromString(StringUtil.trimEnd(file.getName(), ".groovy")); - isScript = file.isScript(); - } - - public GrFileStubImpl(StringRef packName, StringRef name, boolean isScript) { - super(null); - myPackageName = packName; - myName = name; - this.isScript = isScript; - } - - public IStubFileElementType getType() { - return GroovyParserDefinition.GROOVY_FILE; - } - - public StringRef getPackageName() { - return myPackageName; - } - - public StringRef getName() { - return myName; - } - - public boolean isScript() { - return isScript; - } -} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/index/GrAnnotatedMemberIndex.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/index/GrAnnotatedMemberIndex.java index 1b8a5368bd1f..ec2e377773aa 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/index/GrAnnotatedMemberIndex.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/index/GrAnnotatedMemberIndex.java @@ -15,17 +15,17 @@ */ package org.jetbrains.plugins.groovy.lang.psi.stubs.index; -import com.intellij.psi.PsiMember; +import com.intellij.psi.PsiElement; import com.intellij.psi.stubs.StringStubIndexExtension; import com.intellij.psi.stubs.StubIndexKey; /** * @author ilyas */ -public class GrAnnotatedMemberIndex extends StringStubIndexExtension { - public static final StubIndexKey KEY = StubIndexKey.createIndexKey("gr.annot.members"); +public class GrAnnotatedMemberIndex extends StringStubIndexExtension { + public static final StubIndexKey KEY = StubIndexKey.createIndexKey("gr.annot.members"); - public StubIndexKey getKey() { + public StubIndexKey getKey() { return KEY; } } \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/stubs/GroovyCacheUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/stubs/GroovyCacheUtil.java deleted file mode 100644 index 90484d43d8a9..000000000000 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/stubs/GroovyCacheUtil.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2000-2009 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.groovy.lang.stubs; - -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiMember; -import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.stubs.StubIndex; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.plugins.groovy.lang.psi.GrClassSubstitutor; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrAnonymousClassDefinition; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrReferenceList; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMember; -import org.jetbrains.plugins.groovy.lang.psi.stubs.index.GrAnnotatedMemberIndex; -import org.jetbrains.plugins.groovy.lang.psi.stubs.index.GrAnonymousClassIndex; -import org.jetbrains.plugins.groovy.lang.psi.stubs.index.GrDirectInheritorsIndex; - -import java.util.ArrayList; -import java.util.Collection; - -/** - * @author ilyas - */ -public abstract class GroovyCacheUtil { - - @NotNull - public static PsiMember[] getAnnotatedMemberCandidates(PsiClass clazz, GlobalSearchScope scope) { - final String name = clazz.getName(); - if (name == null) return GrMember.EMPTY_ARRAY; - final Collection members = StubIndex.getInstance().get(GrAnnotatedMemberIndex.KEY, name, clazz.getProject(), scope); - return members.toArray(new PsiMember[members.size()]); - } - - @NotNull - public static PsiClass[] getDeriverCandidates(PsiClass clazz, GlobalSearchScope scope) { - final String name = clazz.getName(); - if (name == null) return GrTypeDefinition.EMPTY_ARRAY; - final ArrayList inheritors = new ArrayList(); - final Collection refLists = StubIndex.getInstance().get(GrDirectInheritorsIndex.KEY, name, clazz.getProject(), scope); - for (GrReferenceList list : refLists) { - final PsiElement parent = list.getParent(); - if (parent instanceof GrTypeDefinition) { - inheritors.add(GrClassSubstitutor.getSubstitutedClass(((GrTypeDefinition)parent))); - } - } - final Collection classes = - StubIndex.getInstance().get(GrAnonymousClassIndex.KEY, name, clazz.getProject(), scope); - for (GrAnonymousClassDefinition aClass : classes) { - inheritors.add(aClass); - } - return inheritors.toArray(new PsiClass[inheritors.size()]); - } - - -} From 2e71d015b43912e9b7d8dd8ca0dd1e97964879d5 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 26 Jul 2010 23:17:54 +0100 Subject: [PATCH 14/82] find list literal constructor call usages in Groovy++ method calls --- .../GroovyConstructorUsagesSearchHelper.java | 194 +++++++++++++++--- .../plugins/groovy/gpp/GppTypeConverter.java | 15 +- .../lang/LiteralConstructorUsagesTest.groovy | 66 +++++- 3 files changed, 239 insertions(+), 36 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java index 9a46dcfc2899..30c2c35a4c67 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java @@ -18,19 +18,33 @@ package org.jetbrains.plugins.groovy.findUsages; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadActionProcessor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.NullableComputable; import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.impl.light.LightMemberReference; +import com.intellij.psi.search.DelegatingGlobalSearchScope; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.SearchScope; +import com.intellij.psi.search.searches.AnnotatedElementsSearch; import com.intellij.psi.search.searches.DirectClassInheritorsSearch; +import com.intellij.psi.search.searches.MethodReferencesSearch; import com.intellij.psi.search.searches.ReferencesSearch; +import com.intellij.psi.util.CachedValueProvider; +import com.intellij.psi.util.CachedValuesManager; +import com.intellij.psi.util.PsiModificationTracker; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.Processor; +import com.intellij.util.containers.ConcurrentHashSet; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.GroovyFileType; import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils; +import org.jetbrains.plugins.groovy.gpp.GppTypeConverter; +import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap; @@ -38,11 +52,9 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrConstructorInvocat import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrOpenBlock; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrNewExpression; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrSafeCastExpression; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrTypeCastExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.*; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstant; @@ -50,9 +62,14 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMe import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeElement; import org.jetbrains.plugins.groovy.lang.psi.controlFlow.Instruction; +import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.GroovyExpectedTypesProvider; import org.jetbrains.plugins.groovy.lang.psi.impl.GrTupleType; import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + /** * @author Maxim.Medvedev * Date: May 2, 2009 3:48:53 PM @@ -61,11 +78,12 @@ public class GroovyConstructorUsagesSearchHelper { private GroovyConstructorUsagesSearchHelper() { } - public static boolean execute(final PsiMethod constructor, SearchScope searchScope, final Processor consumer) { + public static boolean execute(final PsiMethod constructor, final SearchScope searchScope, final Processor consumer) { if (!constructor.isConstructor()) return true; - if (searchScope instanceof GlobalSearchScope) { - searchScope = GlobalSearchScope.getScopeRestrictedByFileTypes((GlobalSearchScope)searchScope, GroovyFileType.GROOVY_FILE_TYPE); + SearchScope onlyGroovy = searchScope; + if (onlyGroovy instanceof GlobalSearchScope) { + onlyGroovy = GlobalSearchScope.getScopeRestrictedByFileTypes((GlobalSearchScope)onlyGroovy, GroovyFileType.GROOVY_FILE_TYPE); } final PsiClass clazz = ApplicationManager.getApplication().runReadAction(new NullableComputable() { @@ -97,10 +115,11 @@ public class GroovyConstructorUsagesSearchHelper { } - ReferencesSearch.search(clazz, searchScope, true).forEach(new ReadActionProcessor() { + final Set processedMethods = new ConcurrentHashSet(); + ReferencesSearch.search(clazz, searchScope, true).forEach(new Processor() { @Override - public boolean processInReadAction(PsiReference ref) { - return processClassReference(ref, constructor, consumer); + public boolean process(PsiReference ref) { + return processClassReference(ref, clazz, constructor, consumer, processedMethods, searchScope); } }); @@ -111,7 +130,7 @@ public class GroovyConstructorUsagesSearchHelper { } } //super : does not work now, need to invent a way for it to work without repository - if (!DirectClassInheritorsSearch.search(clazz, searchScope).forEach(new Processor() { + if (!DirectClassInheritorsSearch.search(clazz, onlyGroovy).forEach(new Processor() { public boolean process(PsiClass inheritor) { if (inheritor instanceof GrTypeDefinition) { if (!processConstructors(constructor, consumer, inheritor, false)) return false; @@ -125,12 +144,99 @@ public class GroovyConstructorUsagesSearchHelper { return true; } - private static boolean processClassReference(PsiReference ref, final PsiMethod constructor, final Processor consumer) { + @Nullable + private static PsiMethod getMethodToSearchForCallsWithLiteralArguments(PsiElement element, PsiClass clazz, Set processedMethods) { + final PsiParameter parameter = PsiTreeUtil.getParentOfType(element, PsiParameter.class); + if (parameter != null) { + final PsiMethod method = PsiTreeUtil.getParentOfType(parameter, PsiMethod.class); + if (method != null && processedMethods.add(method) && Arrays.asList(method.getParameterList().getParameters()).contains(parameter)) { + final PsiType parameterType = parameter.getType(); + if (parameterType instanceof PsiClassType) { + if (method.getManager().areElementsEquivalent(clazz, ((PsiClassType)parameterType).resolve())) { + return method; + } + } + } + } + return null; + } + + private static boolean processClassReference(final PsiReference ref, + final PsiClass clazz, + final PsiMethod constructor, + final Processor consumer, + final Set processedMethods, SearchScope scope) { final PsiElement element = ref.getElement(); - if (!(element instanceof GrCodeReferenceElement)) { - return true; + if (element instanceof GrCodeReferenceElement) { + if (!ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public Boolean compute() { + return processGroovyConstructorUsages((GrCodeReferenceElement)element, constructor, consumer, ref); + } + })) { + return false; + } + } + final PsiMethod method = ApplicationManager.getApplication().runReadAction(new Computable() { + public PsiMethod compute() { + return getMethodToSearchForCallsWithLiteralArguments(element, clazz, processedMethods); + } + }); + if (method != null) { + return MethodReferencesSearch.search(method, getGppScope(clazz.getProject()).intersectWith(scope), true).forEach(new ReadActionProcessor() { + @Override + public boolean processInReadAction(PsiReference psiReference) { + if (psiReference instanceof GrReferenceElement) { + final PsiElement parent = ((GrReferenceElement)psiReference).getParent(); + if (parent instanceof GrCall) { + final GrArgumentList argList = ((GrCall)parent).getArgumentList(); + if (argList != null) { + boolean checkedTypedContext = false; + + for (GrExpression argument : argList.getExpressionArguments()) { + if (argument instanceof GrListOrMap && !((GrListOrMap)argument).isMap()) { + if (!checkedTypedContext) { + if (!GppTypeConverter.hasTypedContext(parent)) { + return true; + } + checkedTypedContext = true; + } + + for (PsiType psiType : GroovyExpectedTypesProvider.getDefaultExpectedTypes(argument)) { + if (psiType instanceof PsiClassType && + clazz.getManager().areElementsEquivalent(clazz,((PsiClassType)psiType).resolve()) && + !checkListInstantiation(constructor, consumer, (GrListOrMap)argument, (PsiClassType)psiType)) { + return false; + } + } + } + } + } + } + } + return true; + } + }); + } + + return true; + } + + private static GlobalSearchScope getGppScope(final Project project) { + return CachedValuesManager.getManager(project).getCachedValue(project, new CachedValueProvider() { + @Override + public Result compute() { + return Result.create(calcGppScope(project), PsiModificationTracker.JAVA_STRUCTURE_MODIFICATION_COUNT, ProjectRootManager.getInstance(project)); + } + }); + } + + private static boolean processGroovyConstructorUsages(GrCodeReferenceElement element, + final PsiMethod constructor, + final Processor consumer, + PsiReference ref) { final PsiElement parent = element.getParent(); if (parent instanceof GrNewExpression) { final PsiMethod resolvedConstructor = ((GrNewExpression)parent).resolveConstructor(); @@ -167,13 +273,15 @@ public class GroovyConstructorUsagesSearchHelper { } else if (grandpa instanceof GrTypeCastExpression) { final GrTypeCastExpression cast = (GrTypeCastExpression)grandpa; - if (cast.getCastTypeElement() == typeElement && !checkListInstantiation(constructor, consumer, cast.getOperand(), typeElement)) { + if (cast.getCastTypeElement() == typeElement && + !checkListInstantiation(constructor, consumer, cast.getOperand(), typeElement)) { return false; } } else if (grandpa instanceof GrSafeCastExpression) { final GrSafeCastExpression cast = (GrSafeCastExpression)grandpa; - if (cast.getCastTypeElement() == typeElement && !checkListInstantiation(constructor, consumer, cast.getOperand(), typeElement)) { + if (cast.getCastTypeElement() == typeElement && + !checkListInstantiation(constructor, consumer, cast.getOperand(), typeElement)) { return false; } } @@ -181,6 +289,33 @@ public class GroovyConstructorUsagesSearchHelper { return true; } + private static GlobalSearchScope calcGppScope(Project project) { + final GlobalSearchScope allScope = GlobalSearchScope.allScope(project); + final GlobalSearchScope maximal = GlobalSearchScope.getScopeRestrictedByFileTypes(allScope, GroovyFileType.GROOVY_FILE_TYPE); + GlobalSearchScope gppExtensions = new DelegatingGlobalSearchScope(maximal) { + @Override + public boolean contains(VirtualFile file) { + return super.contains(file) && GppTypeConverter.isGppExtension(file.getExtension()); + } + }; + final PsiClass typed = JavaPsiFacade.getInstance(project).findClass(GppTypeConverter.GROOVY_LANG_TYPED, allScope); + if (typed != null) { + final Set files = new HashSet(); + AnnotatedElementsSearch.searchElements(typed, maximal, PsiModifierListOwner.class).forEach(new Processor() { + @Override + public boolean process(PsiModifierListOwner occurrence) { + ContainerUtil.addIfNotNull(occurrence.getContainingFile().getVirtualFile(), files); + return true; + } + }); + + GlobalSearchScope withTypedAnno = GlobalSearchScope.filesScope(project, files); + return withTypedAnno.union(gppExtensions); + } + + return gppExtensions; + } + private static boolean checkListInstantiation(PsiMethod constructor, Processor consumer, GrExpression expression, final GrTypeElement typeElement) { @@ -188,15 +323,24 @@ public class GroovyConstructorUsagesSearchHelper { final GrListOrMap list = (GrListOrMap)expression; if (!list.isMap()) { final PsiType expectedType = typeElement.getType(); - final PsiType listType = list.getType(); - if (listType instanceof GrTupleType && expectedType instanceof PsiClassType) { - final GroovyResolveResult[] candidates = PsiUtil.getConstructorCandidates((PsiClassType)expectedType, ((GrTupleType)listType).getComponentTypes(), list); - for (GroovyResolveResult candidate : candidates) { - if (constructor.getManager().areElementsEquivalent(candidate.getElement(), constructor)) { - if (!consumer.process(PsiReferenceBase.createSelfReference(list, TextRange.from(0, list.getTextLength()), constructor))) { - return false; - } - } + if (expectedType instanceof PsiClassType) { + return checkListInstantiation(constructor, consumer, list, (PsiClassType)expectedType); + } + } + } + return true; + } + + private static boolean checkListInstantiation(PsiMethod constructor, + Processor consumer, + GrListOrMap list, + PsiClassType expectedType) { + final PsiType listType = list.getType(); + if (listType instanceof GrTupleType) { + for (GroovyResolveResult candidate : PsiUtil.getConstructorCandidates(expectedType, ((GrTupleType)listType).getComponentTypes(), list)) { + if (constructor.getManager().areElementsEquivalent(candidate.getElement(), constructor)) { + if (!consumer.process(PsiReferenceBase.createSelfReference(list, TextRange.from(0, list.getTextLength()), constructor))) { + return false; } } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java index 3a4ea0680f77..ab44998ef803 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java @@ -19,26 +19,29 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.types.GrClosureSignatureUtil; */ public class GppTypeConverter extends GrTypeConverter { + public static final String GROOVY_LANG_TYPED = "groovy.lang.Typed"; + public static boolean hasTypedContext(PsiElement context) { if (context == null) { return false; } - if (AnnotatedContextFilter.hasAnnotatedContext(context, "groovy.lang.Typed")) { + if (AnnotatedContextFilter.hasAnnotatedContext(context, GROOVY_LANG_TYPED)) { return true; } final VirtualFile vfile = context.getContainingFile().getOriginalFile().getVirtualFile(); - if (vfile != null) { - final String extension = vfile.getExtension(); - if ("gpp".equals(extension) || "grunit".equals(vfile.getExtension())) { - return true; - } + if (vfile != null && isGppExtension(vfile.getExtension())) { + return true; } return false; } + public static boolean isGppExtension(String extension) { + return "gpp".equals(extension) || "grunit".equals(extension); + } + @Override public Boolean isConvertible(@NotNull PsiType lType, @NotNull PsiType rType, @NotNull GroovyPsiElement context) { if (rType instanceof GrTupleType) { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/LiteralConstructorUsagesTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/LiteralConstructorUsagesTest.groovy index f6e6df14f708..00432a8cb4d0 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/LiteralConstructorUsagesTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/LiteralConstructorUsagesTest.groovy @@ -7,8 +7,12 @@ import com.intellij.psi.search.searches.ReferencesSearch * @author peter */ class LiteralConstructorUsagesTest extends LightCodeInsightFixtureTestCase { + @Override protected void setUp() { + super.setUp(); + myFixture.addClass("package groovy.lang; public @interface Typed {}"); + } - public void testListVariable() throws Exception { + public void testList_Variable() throws Exception { def foo = myFixture.addClass("""class Foo { Foo() {} } @@ -17,7 +21,7 @@ class LiteralConstructorUsagesTest extends LightCodeInsightFixtureTestCase { assertOneElement(ReferencesSearch.search(foo.constructors[0]).findAll()) } - public void testListReturnValue() throws Exception { + public void testList_ReturnValue() throws Exception { def foo = myFixture.addClass("""class Foo { Foo() {} } @@ -26,7 +30,7 @@ class LiteralConstructorUsagesTest extends LightCodeInsightFixtureTestCase { assertEquals(2, ReferencesSearch.search(foo.constructors[0]).findAll().size()) } - public void testListCast() throws Exception { + public void testList_Cast() throws Exception { def foo = myFixture.addClass("""class Foo { Foo() {} } @@ -35,13 +39,65 @@ class LiteralConstructorUsagesTest extends LightCodeInsightFixtureTestCase { assertOneElement(ReferencesSearch.search(foo.constructors[0]).findAll()) } - public void testListAsCast() throws Exception { + public void testList_AsCast() throws Exception { def foo = myFixture.addClass("""class Foo { Foo() {} } -""") +}""") myFixture.addFileToProject "a.groovy", "def x = [] as Foo" assertOneElement(ReferencesSearch.search(foo.constructors[0]).findAll()) } + public void testList_GppMethodCall() throws Exception { + //------------------------declarations + def foo = myFixture.addClass(""" + package z; + class Foo { + public Foo() {} + } + """) + + myFixture.addClass(""" + package z; + public class Bar { + public static void giveMeFoo(int a, Foo f) {} + } +""") + myFixture.addFileToProject("Decl.groovy", "static def giveMeFooAsWell(z.Foo f) {}") + + //----------------------usages + myFixture.addFileToProject "a.gpp", "z.Bar.giveMeFoo(2, []) //usage" + myFixture.addFileToProject "b.groovy", """ + @Typed package aa; + z.Bar.giveMeFoo(3, []) //usage + """ + myFixture.addFileToProject "c.groovy", """ + @Typed def someMethod() { + z.Bar.giveMeFoo 4, [] //usage + Decl.giveMeFooAsWell([]) //usage + } + z.Bar.giveMeFoo 5, [] //non-typed context + Decl.giveMeFooAsWell([]) + """ + myFixture.addFileToProject "invalid.gpp", "z.Bar.giveMeFoo 42, 239, []" + myFixture.addFileToProject "nonGpp.groovy", "z.Bar.giveMeFoo(6, [])" + assertEquals(4, ReferencesSearch.search(foo.constructors[0]).findAll().size()) + } + + public void testList_GppConstructorCallWithSeveralParameters() throws Exception { + def foo = myFixture.addClass(""" + class Foo { + Foo() {} + } + """) + + myFixture.addClass(""" + class Bar { + Bar(Foo f1, Foo f2, Foo f3) {} + } + """) + myFixture.addFileToProject "a.gpp", "new Bar([],[],[])" + assertEquals(3, ReferencesSearch.search(foo.constructors[0]).findAll().size()) + } + } From 7a0fad2ea3c2d3d6594469b3172220141725adc2 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 27 Jul 2010 20:55:24 +0100 Subject: [PATCH 15/82] merge with maxim's changes --- .../findUsages/GroovyConstructorUsagesSearchHelper.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java index 30c2c35a4c67..e44211b20192 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java @@ -56,6 +56,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgument import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrOpenBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.*; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrAnonymousClassDefinition; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstant; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; @@ -237,7 +238,11 @@ public class GroovyConstructorUsagesSearchHelper { final PsiMethod constructor, final Processor consumer, PsiReference ref) { - final PsiElement parent = element.getParent(); + PsiElement parent = element.getParent(); + + if (parent instanceof GrAnonymousClassDefinition) { + parent = parent.getParent(); + } if (parent instanceof GrNewExpression) { final PsiMethod resolvedConstructor = ((GrNewExpression)parent).resolveConstructor(); if (constructor.getManager().areElementsEquivalent(resolvedConstructor, constructor) && !consumer.process(ref)) { From 9eb2032dab4f90c996dec692cce470bd55f9ac8e Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 27 Jul 2010 23:33:28 +0100 Subject: [PATCH 16/82] optimized find usages for nested searches; groovy/++ constructor usages using that API --- .../searches/MethodReferencesSearch.java | 12 +- .../intellij/psi/search/PsiSearchRequest.java | 4 + .../psi/search/QuerySearchRequest.java | 43 +++++ .../psi/search/SearchRequestCollector.java | 49 +++++- .../psi/search/searches/ReferencesSearch.java | 13 +- .../psi/impl/search/PsiSearchHelperImpl.java | 155 +++++++++++------- .../ConstructorReferencesSearcher.java | 2 +- .../GroovyConstructorUsagesSearchHelper.java | 35 ++-- .../GroovyConstructorUsagesSearcher.java | 6 +- 9 files changed, 219 insertions(+), 100 deletions(-) create mode 100644 platform/lang-api/src/com/intellij/psi/search/QuerySearchRequest.java diff --git a/java/openapi/src/com/intellij/psi/search/searches/MethodReferencesSearch.java b/java/openapi/src/com/intellij/psi/search/searches/MethodReferencesSearch.java index 93bfe3cb66c3..a29b98613b42 100644 --- a/java/openapi/src/com/intellij/psi/search/searches/MethodReferencesSearch.java +++ b/java/openapi/src/com/intellij/psi/search/searches/MethodReferencesSearch.java @@ -17,11 +17,9 @@ package com.intellij.psi.search.searches; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiReference; -import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.search.SearchRequestCollector; -import com.intellij.psi.search.SearchRequestQuery; -import com.intellij.psi.search.SearchScope; +import com.intellij.psi.search.*; import com.intellij.util.MergeQuery; +import com.intellij.util.PairProcessor; import com.intellij.util.Query; import com.intellij.util.UniqueResultsQuery; import gnu.trove.TObjectHashingStrategy; @@ -75,6 +73,12 @@ public class MethodReferencesSearch extends ExtensibleQueryFactory processor) { + final SearchRequestCollector nested = new SearchRequestCollector(); + collector.searchQuery(new QuerySearchRequest(search(new SearchParameters(method, scope, strictSignatureSearch, nested)), nested, + inReadAction, processor)); + } + public static Query search(final SearchParameters parameters) { final Query result = INSTANCE.createQuery(parameters); if (parameters.isSharedOptimizer) { diff --git a/platform/lang-api/src/com/intellij/psi/search/PsiSearchRequest.java b/platform/lang-api/src/com/intellij/psi/search/PsiSearchRequest.java index 5e16c40b8c91..b2a61d521ae7 100644 --- a/platform/lang-api/src/com/intellij/psi/search/PsiSearchRequest.java +++ b/platform/lang-api/src/com/intellij/psi/search/PsiSearchRequest.java @@ -25,4 +25,8 @@ public class PsiSearchRequest { this.processor = processor; } + @Override + public String toString() { + return "PsiSearchRequest: " + word + "; " + processor; + } } diff --git a/platform/lang-api/src/com/intellij/psi/search/QuerySearchRequest.java b/platform/lang-api/src/com/intellij/psi/search/QuerySearchRequest.java new file mode 100644 index 000000000000..158ee91dc151 --- /dev/null +++ b/platform/lang-api/src/com/intellij/psi/search/QuerySearchRequest.java @@ -0,0 +1,43 @@ +package com.intellij.psi.search; + +import com.intellij.openapi.application.ReadActionProcessor; +import com.intellij.psi.PsiReference; +import com.intellij.util.PairProcessor; +import com.intellij.util.Processor; +import com.intellij.util.Query; + +/** + * @author peter + */ +public class QuerySearchRequest { + public final Query query; + public final SearchRequestCollector collector; + public final Processor processor; + + public QuerySearchRequest(Query query, + final SearchRequestCollector collector, + boolean inReadAction, final PairProcessor processor) { + this.query = query; + this.collector = collector; + if (inReadAction) { + this.processor = new ReadActionProcessor() { + @Override + public boolean processInReadAction(PsiReference psiReference) { + return processor.process(psiReference, collector); + } + }; + } else { + this.processor = new Processor() { + @Override + public boolean process(PsiReference psiReference) { + return processor.process(psiReference, collector); + } + }; + } + + } + + public void runQuery() { + query.forEach(processor); + } +} diff --git a/platform/lang-api/src/com/intellij/psi/search/SearchRequestCollector.java b/platform/lang-api/src/com/intellij/psi/search/SearchRequestCollector.java index b4e434ebcf6f..596282772625 100644 --- a/platform/lang-api/src/com/intellij/psi/search/SearchRequestCollector.java +++ b/platform/lang-api/src/com/intellij/psi/search/SearchRequestCollector.java @@ -3,6 +3,7 @@ package com.intellij.psi.search; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReference; import com.intellij.util.Processor; +import com.intellij.util.containers.CollectionFactory; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -12,8 +13,10 @@ import java.util.List; * @author peter */ public class SearchRequestCollector { - private final List myRequests = new ArrayList(); - private final List>> myCustomSearchActions = new ArrayList>>(); + private final Object lock = new Object(); + private final List myWordRequests = CollectionFactory.arrayList(); + private final List myQueryRequests = CollectionFactory.arrayList(); + private final List>> myCustomSearchActions = CollectionFactory.arrayList(); public void searchWord(@NotNull String word, @NotNull SearchScope searchScope, boolean caseSensitive, @NotNull PsiElement searchTarget) { final short searchContext = UsageSearchContext.IN_CODE | UsageSearchContext.IN_FOREIGN_LANGUAGES | UsageSearchContext.IN_COMMENTS; @@ -29,18 +32,48 @@ public class SearchRequestCollector { return; } - myRequests.add(new PsiSearchRequest(searchScope, word, searchContext, caseSensitive, processor)); + synchronized (lock) { + myWordRequests.add(new PsiSearchRequest(searchScope, word, searchContext, caseSensitive, processor)); + } + } + + public void searchQuery(QuerySearchRequest request) { + assert request.collector != this; + synchronized (lock) { + myQueryRequests.add(request); + } } public void searchCustom(Processor> searchAction) { - myCustomSearchActions.add(searchAction); + synchronized (lock) { + myCustomSearchActions.add(searchAction); + } } - public List getSearchRequests() { - return myRequests; + public boolean hasRequests() { + synchronized (lock) { + return !myWordRequests.isEmpty() || !myCustomSearchActions.isEmpty() || !myQueryRequests.isEmpty(); + } } - public List>> getCustomSearchActions() { - return myCustomSearchActions; + public List takeQueryRequests() { + return takeRequests(myQueryRequests); + } + + private List takeRequests(List list) { + synchronized (lock) { + final List requests = new ArrayList(list); + requests.addAll(list); + list.clear(); + return requests; + } + } + + public List takeSearchRequests() { + return takeRequests(myWordRequests); + } + + public List>> takeCustomSearchActions() { + return takeRequests(myCustomSearchActions); } } diff --git a/platform/lang-api/src/com/intellij/psi/search/searches/ReferencesSearch.java b/platform/lang-api/src/com/intellij/psi/search/searches/ReferencesSearch.java index c43a8875a6f5..e2dc5c6ff22f 100644 --- a/platform/lang-api/src/com/intellij/psi/search/searches/ReferencesSearch.java +++ b/platform/lang-api/src/com/intellij/psi/search/searches/ReferencesSearch.java @@ -17,10 +17,7 @@ package com.intellij.psi.search.searches; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReference; -import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.search.SearchRequestCollector; -import com.intellij.psi.search.SearchRequestQuery; -import com.intellij.psi.search.SearchScope; +import com.intellij.psi.search.*; import com.intellij.util.*; import gnu.trove.TObjectHashingStrategy; import org.jetbrains.annotations.NotNull; @@ -111,4 +108,12 @@ public class ReferencesSearch extends ExtensibleQueryFactory processor) { + final SearchRequestCollector nested = new SearchRequestCollector(); + collector.searchQuery(new QuerySearchRequest(search(new SearchParameters(element, searchScope, ignoreAccessScope, nested)), nested, + inReadAction, processor)); + } + + } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java index 425e5c86fd81..24e17f5319c4 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java @@ -31,6 +31,7 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; @@ -487,34 +488,62 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { myManager.getCacheManager().processFilesWithWord(processor, word, UsageSearchContext.IN_STRINGS, scope, true); } - public boolean processRequests(@NotNull SearchRequestCollector request, Processor processor) { - final MultiMap, PsiSearchRequest> singles = new MultiMap, PsiSearchRequest>(); - final List>> customs = new ArrayList>>(); - distributePrimitives(request, singles, customs); - - if (!processRequestsOptimized(singles, processor)) { - return false; + private static class RequestWithProcessor extends Pair> { + private RequestWithProcessor(PsiSearchRequest first, Processor second) { + super(first, second); } - - for (Processor> custom : customs) { - if (!custom.process(processor)) { - return false; - } - } - - return true; - } - private boolean processRequestsOptimized(MultiMap, PsiSearchRequest> singles, final Processor consumer) { + public boolean processRequests(@NotNull SearchRequestCollector collector, Processor processor) { + Map> collectors = new HashMap>(); + collectors.put(collector, processor); + + appendCollectorsFromQueryRequests(collectors); + + do { + final MultiMap, RequestWithProcessor> singles = new MultiMap, RequestWithProcessor>(); + final List> customs = new ArrayList>(); + distributePrimitives(collectors, singles, customs); + + if (!processRequestsOptimized(singles)) { + return false; + } + + for (Computable custom : customs) { + if (!custom.compute()) { + return false; + } + } + } while (appendCollectorsFromQueryRequests(collectors)); + + return true; + } + + private static boolean appendCollectorsFromQueryRequests(Map> collectors) { + boolean changed = false; + LinkedList queue = new LinkedList(collectors.keySet()); + while (!queue.isEmpty()) { + final SearchRequestCollector each = queue.removeFirst(); + for (QuerySearchRequest request : each.takeQueryRequests()) { + request.runQuery(); + collectors.put(request.collector, request.processor); + queue.addLast(request.collector); + changed = true; + } + } + return changed; + } + + private boolean processRequestsOptimized(MultiMap, RequestWithProcessor> singles) { if (singles.isEmpty()) { return true; } if (singles.size() == 1) { - final Collection requests = singles.get(singles.keySet().iterator().next()); + final Collection requests = singles.get(singles.keySet().iterator().next()); if (requests.size() == 1) { - return processSingleRequest(requests.iterator().next(), consumer); + final RequestWithProcessor theOnly = requests.iterator().next(); + return processSingleRequest(theOnly.first, theOnly.second); } } @@ -524,13 +553,13 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { progress.setText(PsiBundle.message("psi.scanning.files.progress")); } - final MultiMap candidateFiles = collectFiles(singles); + final MultiMap candidateFiles = collectFiles(singles); - final Map searchers = new HashMap(); + final Map searchers = new HashMap(); final Set allWords = new TreeSet(); - for (PsiSearchRequest singleRequest : candidateFiles.values()) { - searchers.put(singleRequest, new StringSearcher(singleRequest.word, singleRequest.caseSensitive, true)); - allWords.add(singleRequest.word); + for (RequestWithProcessor singleRequest : candidateFiles.values()) { + searchers.put(singleRequest, new StringSearcher(singleRequest.first.word, singleRequest.first.caseSensitive, true)); + allWords.add(singleRequest.first.word); } if (progress != null) { @@ -540,9 +569,9 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { return processPsiFileRoots(progress, new ArrayList(candidateFiles.keySet()), new Processor() { public boolean process(PsiElement psiRoot) { final VirtualFile vfile = psiRoot.getContainingFile().getVirtualFile(); - for (final PsiSearchRequest singleRequest : candidateFiles.get(vfile)) { + for (final RequestWithProcessor singleRequest : candidateFiles.get(vfile)) { StringSearcher searcher = searchers.get(singleRequest); - if (!LowLevelSearchUtil.processElementsContainingWordInElement(adaptProcessor(singleRequest, consumer), psiRoot, searcher, false, progress)) { + if (!LowLevelSearchUtil.processElementsContainingWordInElement(adaptProcessor(singleRequest.first, singleRequest.second), psiRoot, searcher, false, progress)) { return false; } } @@ -565,18 +594,18 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { }; } - private MultiMap collectFiles(MultiMap, PsiSearchRequest> singles) { + private MultiMap collectFiles(MultiMap, RequestWithProcessor> singles) { final ProjectFileIndex index = ProjectRootManager.getInstance(myManager.getProject()).getFileIndex(); - final MultiMap result = new MultiMap(); + final MultiMap result = new MultiMap(); for (Set key : singles.keySet()) { - final Collection data = singles.get(key); + final Collection data = singles.get(key); GlobalSearchScope commonScope = uniteScopes(data); - MultiMap intersection = null; + MultiMap intersection = null; boolean first = true; for (IdIndexEntry entry : key) { - final MultiMap local = findFilesWithIndexEntry(entry, index, data, commonScope); + final MultiMap local = findFilesWithIndexEntry(entry, index, data, commonScope); if (first) { intersection = local; first = false; @@ -593,31 +622,34 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { return result; } - private static GlobalSearchScope uniteScopes(Collection requests) { + private static GlobalSearchScope uniteScopes(Collection requests) { GlobalSearchScope commonScope = null; - for (PsiSearchRequest r : requests) { - final GlobalSearchScope scope = (GlobalSearchScope)r.searchScope; + for (RequestWithProcessor r : requests) { + final GlobalSearchScope scope = (GlobalSearchScope)r.first.searchScope; commonScope = commonScope == null ? scope : commonScope.uniteWith(scope); } assert commonScope != null; return commonScope; } - private static MultiMap findFilesWithIndexEntry(final IdIndexEntry entry, + private static MultiMap findFilesWithIndexEntry(final IdIndexEntry entry, final ProjectFileIndex index, - final Collection data, + final Collection data, final GlobalSearchScope commonScope) { - final MultiMap local = new MultiMap(); + final MultiMap local = new MultiMap(); ApplicationManager.getApplication().runReadAction(new Runnable() { public void run() { + ProgressManager.checkCanceled(); FileBasedIndex.getInstance().processValues(IdIndex.NAME, entry, null, new FileBasedIndex.ValueProcessor() { public boolean process(VirtualFile file, Integer value) { + ProgressManager.checkCanceled(); if (!IndexCacheManagerImpl.shouldBeFound(file, index)) { return true; } int mask = value.intValue(); - for (PsiSearchRequest single : data) { - if ((mask & single.searchContext) != 0 && ((GlobalSearchScope)single.searchScope).contains(file)) { + for (RequestWithProcessor single : data) { + final PsiSearchRequest request = single.first; + if ((mask & request.searchContext) != 0 && ((GlobalSearchScope)request.searchScope).contains(file)) { local.putValue(file, single); } } @@ -630,27 +662,38 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { return local; } - private void distributePrimitives(SearchRequestCollector request, - MultiMap, PsiSearchRequest> singles, - List>> customs) { - for (final PsiSearchRequest primitive : request.getSearchRequests()) { - final SearchScope scope = primitive.searchScope; - if (scope instanceof LocalSearchScope) { - customs.add(new Processor>() { - public boolean process(Processor processor) { - return processSingleRequest(primitive, processor); + private void distributePrimitives(final Map> collectors, + MultiMap, RequestWithProcessor> singles, + List> customs) { + for (final SearchRequestCollector collector : collectors.keySet()) { + final Processor processor = collectors.get(collector); + for (final PsiSearchRequest primitive : collector.takeSearchRequests()) { + final SearchScope scope = primitive.searchScope; + if (scope instanceof LocalSearchScope) { + customs.add(new Computable() { + @Override + public Boolean compute() { + return processSingleRequest(primitive, processor); + } + }); + } else { + final List words = StringUtil.getWordsIn(primitive.word); + final Set key = new HashSet(words.size() * 2); + for (String word : words) { + key.add(new IdIndexEntry(word, primitive.caseSensitive)); + } + singles.putValue(key, new RequestWithProcessor(primitive, processor)); + } + } + for (final Processor> customAction : collector.takeCustomSearchActions()) { + customs.add(new Computable() { + @Override + public Boolean compute() { + return customAction.process(processor); } }); - } else { - final List words = StringUtil.getWordsIn(primitive.word); - final Set key = new HashSet(words.size() * 2); - for (String word : words) { - key.add(new IdIndexEntry(word, primitive.caseSensitive)); - } - singles.putValue(key, primitive); } } - customs.addAll(request.getCustomSearchActions()); } private boolean processSingleRequest(PsiSearchRequest single, Processor consumer) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/ConstructorReferencesSearcher.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/ConstructorReferencesSearcher.java index 138a9034642a..6af2559d1122 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/ConstructorReferencesSearcher.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/ConstructorReferencesSearcher.java @@ -31,7 +31,7 @@ public class ConstructorReferencesSearcher implements QueryExecutor consumer) { + public static boolean processConstructorUsages(final PsiMethod constructor, final SearchScope searchScope, final Processor consumer, final SearchRequestCollector collector) { if (!constructor.isConstructor()) return true; SearchScope onlyGroovy = searchScope; @@ -117,10 +115,11 @@ public class GroovyConstructorUsagesSearchHelper { final Set processedMethods = new ConcurrentHashSet(); - ReferencesSearch.search(clazz, searchScope, true).forEach(new Processor() { + + ReferencesSearch.searchOptimized(clazz, searchScope, true, collector, true, new PairProcessor() { @Override - public boolean process(PsiReference ref) { - return processClassReference(ref, clazz, constructor, consumer, processedMethods, searchScope); + public boolean process(PsiReference ref, SearchRequestCollector collector) { + return processClassReference(ref, clazz, constructor, consumer, processedMethods, searchScope, collector); } }); @@ -166,29 +165,21 @@ public class GroovyConstructorUsagesSearchHelper { final PsiClass clazz, final PsiMethod constructor, final Processor consumer, - final Set processedMethods, SearchScope scope) { + final Set processedMethods, SearchScope scope, SearchRequestCollector collector) { final PsiElement element = ref.getElement(); if (element instanceof GrCodeReferenceElement) { - if (!ApplicationManager.getApplication().runReadAction(new Computable() { - @Override - public Boolean compute() { - return processGroovyConstructorUsages((GrCodeReferenceElement)element, constructor, consumer, ref); - } - })) { + if (!processGroovyConstructorUsages((GrCodeReferenceElement)element, constructor, consumer, ref)) { return false; } } - final PsiMethod method = ApplicationManager.getApplication().runReadAction(new Computable() { - public PsiMethod compute() { - return getMethodToSearchForCallsWithLiteralArguments(element, clazz, processedMethods); - } - }); + final PsiMethod method = getMethodToSearchForCallsWithLiteralArguments(element, clazz, processedMethods); if (method != null) { - return MethodReferencesSearch.search(method, getGppScope(clazz.getProject()).intersectWith(scope), true).forEach(new ReadActionProcessor() { + final GlobalSearchScope gppScope = getGppScope(clazz.getProject()); + MethodReferencesSearch.searchOptimized(method, gppScope.intersectWith(scope), true, collector, true, new PairProcessor() { @Override - public boolean processInReadAction(PsiReference psiReference) { + public boolean process(PsiReference psiReference, SearchRequestCollector collector) { if (psiReference instanceof GrReferenceElement) { final PsiElement parent = ((GrReferenceElement)psiReference).getParent(); if (parent instanceof GrCall) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearcher.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearcher.java index da1ef93bd10f..8a2a8ebbfa36 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearcher.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearcher.java @@ -16,9 +16,7 @@ package org.jetbrains.plugins.groovy.findUsages; -import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiReference; -import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.searches.MethodReferencesSearch; import com.intellij.util.Processor; import com.intellij.util.QueryExecutor; @@ -28,8 +26,6 @@ import com.intellij.util.QueryExecutor; */ public class GroovyConstructorUsagesSearcher implements QueryExecutor { public boolean execute(MethodReferencesSearch.SearchParameters p, final Processor consumer) { - final PsiMethod method = p.getMethod(); - final SearchScope searchScope = p.getScope(); - return GroovyConstructorUsagesSearchHelper.execute(method, searchScope, consumer); + return GroovyConstructorUsagesSearchHelper.processConstructorUsages(p.getMethod(), p.getScope(), consumer, p.getOptimizer()); } } From 080ab7ce655e6eaf4becfa8539ebbb57266a1ebe Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 28 Jul 2010 00:04:21 +0100 Subject: [PATCH 17/82] optimized java constructor usage searcher --- .../ConstructorReferencesSearchHelper.java | 68 ++++++------------- .../search/ConstructorReferencesSearcher.java | 16 +++-- .../psi/impl/search/MethodUsagesSearcher.java | 57 ++++++---------- .../psi/search/searches/ReferencesSearch.java | 9 +++ 4 files changed, 60 insertions(+), 90 deletions(-) diff --git a/java/java-impl/src/com/intellij/psi/impl/search/ConstructorReferencesSearchHelper.java b/java/java-impl/src/com/intellij/psi/impl/search/ConstructorReferencesSearchHelper.java index 3d9715e89932..bbad1ed8e70a 100644 --- a/java/java-impl/src/com/intellij/psi/impl/search/ConstructorReferencesSearchHelper.java +++ b/java/java-impl/src/com/intellij/psi/impl/search/ConstructorReferencesSearchHelper.java @@ -3,17 +3,15 @@ */ package com.intellij.psi.impl.search; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.application.ReadActionProcessor; -import com.intellij.openapi.util.Computable; -import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.impl.light.LightMemberReference; import com.intellij.psi.search.PsiSearchScopeUtil; +import com.intellij.psi.search.SearchRequestCollector; import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.searches.ClassInheritorsSearch; import com.intellij.psi.search.searches.ReferencesSearch; +import com.intellij.util.PairProcessor; import com.intellij.util.Processor; /** @@ -30,38 +28,29 @@ public class ConstructorReferencesSearchHelper { final PsiMethod constructor, final SearchScope searchScope, boolean ignoreAccessScope, - final boolean isStrictSignatureSearch) { - final Ref result = new Ref(); - PsiClass aClass = ApplicationManager.getApplication().runReadAction(new Computable() { - public PsiClass compute() { - PsiClass aClass = constructor.getContainingClass(); - if (aClass == null) { - result.set(true); - return null; - } + final boolean isStrictSignatureSearch, SearchRequestCollector collector) { + PsiClass aClass = constructor.getContainingClass(); + if (aClass == null) { + return true; + } - if (aClass.isEnum()) { - PsiField[] fields = aClass.getFields(); - for (PsiField field : fields) { - if (field instanceof PsiEnumConstant) { - PsiReference reference = field.getReference(); - if (reference != null && reference.isReferenceTo(constructor)) { - if (!processor.process(reference)) { - result.set(false); - return null; - } - } + if (aClass.isEnum()) { + for (PsiField field : aClass.getFields()) { + if (field instanceof PsiEnumConstant) { + PsiReference reference = field.getReference(); + if (reference != null && reference.isReferenceTo(constructor)) { + if (!processor.process(reference)) { + return false; } } } - return aClass; } - }); - if (!result.isNull()) return result.get(); + } // search usages like "new XXX(..)" - Processor processor1 = new ReadActionProcessor() { - public boolean processInReadAction(final PsiReference reference) { + PairProcessor processor1 = new PairProcessor() { + @Override + public boolean process(PsiReference reference, SearchRequestCollector collector) { PsiElement parent = reference.getElement().getParent(); if (parent instanceof PsiAnonymousClass) { parent = parent.getParent(); @@ -85,12 +74,12 @@ public class ConstructorReferencesSearchHelper { } }; - if (!ReferencesSearch.search(aClass, searchScope, ignoreAccessScope).forEach(processor1)) return false; + ReferencesSearch.searchOptimized(aClass, searchScope, ignoreAccessScope, collector, true, processor1); final boolean constructorCanBeCalledImplicitly = constructor.getParameterList().getParametersCount() == 0; // search usages like "this(..)" if (!processSuperOrThis(processor, aClass, constructor, constructorCanBeCalledImplicitly, searchScope, isStrictSignatureSearch, - PsiKeyword.THIS)) { + PsiKeyword.THIS)) { return false; } @@ -98,7 +87,7 @@ public class ConstructorReferencesSearchHelper { Processor processor2 = new Processor() { public boolean process(PsiClass inheritor) { return processSuperOrThis(processor, (PsiClass)inheritor.getNavigationElement(), constructor, constructorCanBeCalledImplicitly, searchScope, isStrictSignatureSearch, - PsiKeyword.SUPER); + PsiKeyword.SUPER); } }; @@ -110,21 +99,6 @@ public class ConstructorReferencesSearchHelper { final PsiMethod constructor, final boolean constructorCanBeCalledImplicitly, final SearchScope searchScope, final boolean isStrictSignatureSearch, final String superOrThisKeyword) { - return ApplicationManager.getApplication().runReadAction(new Computable() { - public Boolean compute() { - return processSuperOrThisInReadAction(inheritor, searchScope, superOrThisKeyword, isStrictSignatureSearch, constructor, - constructorCanBeCalledImplicitly, processor); - } - }); - } - - private boolean processSuperOrThisInReadAction(final PsiClass inheritor, - final SearchScope searchScope, - final String superOrThisKeyword, - final boolean isStrictSignatureSearch, - final PsiMethod constructor, - final boolean constructorCanBeCalledImplicitly, - final Processor processor) { PsiMethod[] constructors = inheritor.getConstructors(); if (constructors.length == 0 && constructorCanBeCalledImplicitly) { processImplicitConstructorCall(inheritor, processor, constructor, inheritor); diff --git a/java/java-impl/src/com/intellij/psi/impl/search/ConstructorReferencesSearcher.java b/java/java-impl/src/com/intellij/psi/impl/search/ConstructorReferencesSearcher.java index acb87007dc39..85382259fdb0 100644 --- a/java/java-impl/src/com/intellij/psi/impl/search/ConstructorReferencesSearcher.java +++ b/java/java-impl/src/com/intellij/psi/impl/search/ConstructorReferencesSearcher.java @@ -3,24 +3,28 @@ */ package com.intellij.psi.impl.search; +import com.intellij.openapi.application.QueryExecutorBase; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiManager; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiReference; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.util.Processor; -import com.intellij.util.QueryExecutor; /** * @author max */ -public class ConstructorReferencesSearcher implements QueryExecutor { - public boolean execute(final ReferencesSearch.SearchParameters p, final Processor consumer) { +public class ConstructorReferencesSearcher extends QueryExecutorBase { + protected ConstructorReferencesSearcher() { + super(true); + } + + @Override + public void processQuery(ReferencesSearch.SearchParameters p, Processor consumer) { final PsiElement element = p.getElementToSearch(); if (element instanceof PsiMethod && ((PsiMethod)element).isConstructor()) { - return new ConstructorReferencesSearchHelper(PsiManager.getInstance(element.getProject())) - .processConstructorReferences(consumer, (PsiMethod)p.getElementToSearch(), p.getScope(), p.isIgnoreAccessScope(), true); + new ConstructorReferencesSearchHelper(PsiManager.getInstance(element.getProject())) + .processConstructorReferences(consumer, (PsiMethod)p.getElementToSearch(), p.getScope(), p.isIgnoreAccessScope(), true, p.getOptimizer()); } - return true; } } diff --git a/java/java-impl/src/com/intellij/psi/impl/search/MethodUsagesSearcher.java b/java/java-impl/src/com/intellij/psi/impl/search/MethodUsagesSearcher.java index a09f590f3c08..2e51faa888d2 100644 --- a/java/java-impl/src/com/intellij/psi/impl/search/MethodUsagesSearcher.java +++ b/java/java-impl/src/com/intellij/psi/impl/search/MethodUsagesSearcher.java @@ -3,9 +3,7 @@ */ package com.intellij.psi.impl.search; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.QueryExecutorBase; -import com.intellij.openapi.util.Computable; import com.intellij.psi.*; import com.intellij.psi.search.SearchRequestCollector; import com.intellij.psi.search.SearchScope; @@ -18,6 +16,9 @@ import com.intellij.util.Processor; * @author max */ public class MethodUsagesSearcher extends QueryExecutorBase { + protected MethodUsagesSearcher() { + super(true); + } @Override public void processQuery(MethodReferencesSearch.SearchParameters p, Processor consumer) { @@ -28,60 +29,42 @@ public class MethodUsagesSearcher extends QueryExecutorBase() { - public PsiClass compute() { - return method.isValid() ? method.getContainingClass() : null; - } - }); + final PsiClass aClass = method.getContainingClass(); if (aClass == null) return; final boolean strictSignatureSearch = p.isStrictSignatureSearch(); if (method.isConstructor()) { - collector.searchCustom(new Processor>() { - public boolean process(Processor consumer) { - return new ConstructorReferencesSearchHelper(psiManager). - processConstructorReferences(consumer, method, searchScope, !strictSignatureSearch, strictSignatureSearch); - } - }); + new ConstructorReferencesSearchHelper(psiManager). + processConstructorReferences(consumer, method, searchScope, !strictSignatureSearch, strictSignatureSearch, collector); } - boolean needStrictSignatureSearch = ApplicationManager.getApplication().runReadAction(new Computable() { - public Boolean compute() { - return method.isValid() && strictSignatureSearch && (aClass instanceof PsiAnonymousClass + boolean needStrictSignatureSearch = strictSignatureSearch && (aClass instanceof PsiAnonymousClass || aClass.hasModifierProperty(PsiModifier.FINAL) || method.hasModifierProperty(PsiModifier.STATIC) || method.hasModifierProperty(PsiModifier.FINAL) || method.hasModifierProperty(PsiModifier.PRIVATE)); - } - }); if (needStrictSignatureSearch) { - ReferencesSearch.search(new ReferencesSearch.SearchParameters(method, searchScope, false, collector)).forEach(consumer); + ReferencesSearch.searchOptimized(method, searchScope, false, collector, consumer); return; } - ApplicationManager.getApplication().runReadAction(new Runnable() { - public void run() { - if (!method.isValid()) return; + final String textToSearch = method.getName(); + final PsiMethod[] methods = strictSignatureSearch ? new PsiMethod[]{method} : aClass.findMethodsByName(textToSearch, false); - final String textToSearch = method.getName(); - final PsiMethod[] methods = strictSignatureSearch ? new PsiMethod[]{method} : aClass.findMethodsByName(textToSearch, false); + SearchScope accessScope = methods[0].getUseScope(); + for (int i = 1; i < methods.length; i++) { + PsiMethod method1 = methods[i]; + accessScope = accessScope.union(method1.getUseScope()); + } - SearchScope accessScope = methods[0].getUseScope(); - for (int i = 1; i < methods.length; i++) { - PsiMethod method1 = methods[i]; - accessScope = accessScope.union(method1.getUseScope()); - } + final SearchScope restrictedByAccess = searchScope.intersectWith(accessScope); - final SearchScope restrictedByAccess = searchScope.intersectWith(accessScope); + short searchContext = UsageSearchContext.IN_CODE | UsageSearchContext.IN_COMMENTS | UsageSearchContext.IN_FOREIGN_LANGUAGES; + collector.searchWord(textToSearch, restrictedByAccess, searchContext, true, + new MethodTextOccurrenceProcessor(aClass, strictSignatureSearch, methods)); - short searchContext = UsageSearchContext.IN_CODE | UsageSearchContext.IN_COMMENTS | UsageSearchContext.IN_FOREIGN_LANGUAGES; - collector.searchWord(textToSearch, restrictedByAccess, searchContext, true, - new MethodTextOccurrenceProcessor(aClass, strictSignatureSearch, methods)); - - SimpleAccessorReferenceSearcher.addPropertyAccessUsages(method, restrictedByAccess, collector); - } - }); + SimpleAccessorReferenceSearcher.addPropertyAccessUsages(method, restrictedByAccess, collector); } diff --git a/platform/lang-api/src/com/intellij/psi/search/searches/ReferencesSearch.java b/platform/lang-api/src/com/intellij/psi/search/searches/ReferencesSearch.java index e2dc5c6ff22f..aa869f7b507c 100644 --- a/platform/lang-api/src/com/intellij/psi/search/searches/ReferencesSearch.java +++ b/platform/lang-api/src/com/intellij/psi/search/searches/ReferencesSearch.java @@ -108,6 +108,15 @@ public class ReferencesSearch extends ExtensibleQueryFactory processor) { + searchOptimized(element, searchScope, ignoreAccessScope, collector, false, new PairProcessor() { + @Override + public boolean process(PsiReference psiReference, SearchRequestCollector collector) { + return processor.process(psiReference); + } + }); + } public static void searchOptimized(@NotNull PsiElement element, @NotNull SearchScope searchScope, boolean ignoreAccessScope, @NotNull SearchRequestCollector collector, final boolean inReadAction, PairProcessor processor) { final SearchRequestCollector nested = new SearchRequestCollector(); From eec6830c3fb2da2b2e1dda738ef1be0065a548b3 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 28 Jul 2010 00:29:39 +0100 Subject: [PATCH 18/82] if there are no files containing a word, don't change the find usages progress indicator text --- .../src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/platform/lang-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java index 24e17f5319c4..878523e34bd8 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java @@ -555,6 +555,10 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { final MultiMap candidateFiles = collectFiles(singles); + if (candidateFiles.isEmpty()) { + return true; + } + final Map searchers = new HashMap(); final Set allWords = new TreeSet(); for (RequestWithProcessor singleRequest : candidateFiles.values()) { From ba691da22654c3747e4b6fcac503fd12e0d446be Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 28 Jul 2010 10:17:42 +0400 Subject: [PATCH 19/82] create valid manifest.mf file in artifact editor --- .../impl/elements/ManifestFileUtil.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/elements/ManifestFileUtil.java b/java/compiler/impl/src/com/intellij/packaging/impl/elements/ManifestFileUtil.java index f326e2f1e831..21433a5e74e3 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/elements/ManifestFileUtil.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/elements/ManifestFileUtil.java @@ -249,13 +249,19 @@ public class ManifestFileUtil { VirtualFile dir = files[0]; try { if (!dir.getName().equals(MANIFEST_DIR_NAME)) { - VirtualFile newDir = dir.findChild(MANIFEST_DIR_NAME); - if (newDir == null) { - newDir = dir.createChildDirectory(this, MANIFEST_DIR_NAME); - } - dir = newDir; + dir = VfsUtil.createDirectoryIfMissing(dir, MANIFEST_DIR_NAME); } - result.setResult(dir.createChildData(this, MANIFEST_FILE_NAME)); + final VirtualFile file = dir.createChildData(this, MANIFEST_FILE_NAME); + final OutputStream output = file.getOutputStream(this); + try { + final Manifest manifest = new Manifest(); + ManifestBuilder.setVersionAttribute(manifest.getMainAttributes()); + manifest.write(output); + } + finally { + output.close(); + } + result.setResult(file); } catch (IOException e) { exc.set(e); From 8bb207d4d1104dfcff46f131e85fd204f7c133c3 Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 28 Jul 2010 10:32:17 +0400 Subject: [PATCH 20/82] publish artifacts as soon as they build --- build/scripts/dist.gant | 12 +++++++++--- build/scripts/utils.gant | 8 ++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/build/scripts/dist.gant b/build/scripts/dist.gant index 07e8849d3af9..2921df30192a 100644 --- a/build/scripts/dist.gant +++ b/build/scripts/dist.gant @@ -136,10 +136,12 @@ private def layoutWin(Map args, String home, Paths paths) { patchPropertiesFile(paths.distWin) ant.echo(file: "$paths.distWin/bin/idea.exe.vmoptions", message: args.vmoptions.replace(' ', '\n')) - ant.zip(zipfile: "$paths.artifacts/idea${args.buildNumber}.win.zip") { + def winZipPath = "$paths.artifacts/idea${args.buildNumber}.win.zip" + ant.zip(zipfile: winZipPath) { fileset(dir: paths.distAll) fileset(dir: paths.distWin) } + notifyArtifactBuilt(winZipPath) } private def layoutMac(Map args, String home, Paths paths) { @@ -170,7 +172,8 @@ private def layoutMac(Map args, String home, Paths paths) { def root = isEap() ? "${version}-${args.buildNumber}.app" : "IntelliJ IDEA ${version} CE.app" - ant.zip(zipfile: "$paths.artifacts/idea${args.buildNumber}.mac.zip") { + def macZipPath = "$paths.artifacts/idea${args.buildNumber}.mac.zip" + ant.zip(zipfile: macZipPath) { [paths.distAll, paths.distMac].each { tarfileset(dir: it, prefix: root) { exclude(name: "bin/*.sh") @@ -183,6 +186,7 @@ private def layoutMac(Map args, String home, Paths paths) { include(name: "Contents/MacOS/idea") } } + notifyArtifactBuilt(macZipPath) } def layoutLinux(Map args, String home, Paths paths) { @@ -216,7 +220,9 @@ def layoutLinux(Map args, String home, Paths paths) { } } - ant.gzip(src: tarPath, zipfile: "${tarPath}.gz") + def gzPath = "${tarPath}.gz" + ant.gzip(src: tarPath, zipfile: gzPath) ant.delete(file: tarPath) + notifyArtifactBuilt(gzPath) } diff --git a/build/scripts/utils.gant b/build/scripts/utils.gant index 8be15353d412..5f46552722dc 100644 --- a/build/scripts/utils.gant +++ b/build/scripts/utils.gant @@ -88,3 +88,11 @@ binding.setVariable("loadProject", { requireProperty("home", guessHome()) project.builder.buildInfoPrinter = new org.jetbrains.jps.teamcity.TeamcityBuildInfoPrinter() + +binding.setVariable("notifyArtifactBuilt", { String artifactPath -> + if (!artifactPath.startsWith(home)) { + project.error("Artifact path $artifactPath should start with $home") + } + def relativePath = artifactPath.substring(home.length()) + project.info("##teamcity[publishArtifacts '$relativePath']") +}) \ No newline at end of file From 60be87e12e6fe312fe7143def32990b2ddab7b3f Mon Sep 17 00:00:00 2001 From: Denis Zhdanov Date: Wed, 28 Jul 2010 11:09:21 +0400 Subject: [PATCH 21/82] IDEA-56409 Soft wrap, editing: AIOOBE at EditorImpl$EditorSizeContainer.changedUpdate() on removing a code that doesn't fit editor's width and height Added additional check for the situation when complete document is emptied --- .../src/com/intellij/openapi/editor/impl/EditorImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index 4e0f3a5e789c..6b743f8f0687 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -4649,7 +4649,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi public synchronized void update(int startLine, int newEndLine, int oldEndLine) { final int lineWidthSize = myLineWidths.size(); - if (lineWidthSize == 0) { + if (lineWidthSize == 0 || myDocument.getTextLength() <= 0) { reset(); } else { From 77d68210d82d3de0968bbf0b2d35d84dac7b3314 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 26 Jul 2010 15:52:45 +0400 Subject: [PATCH 22/82] New Java parser (work in progress) --- .../lang/java/parser/DeclarationParser.java | 122 ++++++++++++++++-- .../lang/java/parser/JavaParserUtil.java | 119 ++++++++++++++++- .../lang/java/parser/StatementParser.java | 30 +++++ .../psi/impl/source/tree/JavaElementType.java | 2 +- .../declarations/EmptyBody0.txt | 4 + .../declarations/EmptyBody1.txt | 5 + .../parser-partial/declarations/EnumBody0.txt | 6 + .../parser-partial/declarations/EnumBody1.txt | 28 ++++ .../parser-partial/declarations/EnumBody2.txt | 27 ++++ .../parser-partial/declarations/EnumBody3.txt | 28 ++++ .../parser-partial/declarations/EnumBody4.txt | 37 ++++++ .../parser-partial/declarations/EnumBody5.txt | 22 ++++ .../parser/partial/DeclarationParserTest.java | 45 +++++++ 13 files changed, 459 insertions(+), 16 deletions(-) create mode 100644 java/java-impl/src/com/intellij/lang/java/parser/StatementParser.java create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/EmptyBody0.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/EmptyBody1.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/EnumBody0.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/EnumBody1.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/EnumBody2.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/EnumBody3.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/EnumBody4.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/EnumBody5.txt create mode 100644 java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java diff --git a/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java b/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java index 268e9c2fd5ac..183accdbf72b 100644 --- a/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java +++ b/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java @@ -18,6 +18,7 @@ package com.intellij.lang.java.parser; import com.intellij.codeInsight.daemon.JavaErrorMessages; import com.intellij.lang.LighterASTNode; import com.intellij.lang.PsiBuilder; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.JavaTokenType; import com.intellij.psi.impl.source.tree.ElementType; import com.intellij.psi.impl.source.tree.JavaElementType; @@ -36,6 +37,8 @@ public class DeclarationParser { FILE, CLASS, CODE_BLOCK, ANNOTATION_INTERFACE } + private static final Logger LOG = Logger.getInstance("#com.intellij.lang.java.parser.DeclarationParser"); + private static final TokenSet AFTER_END_DECLARATION_SET = TokenSet.create(JavaElementType.FIELD, JavaElementType.METHOD); private DeclarationParser() { } @@ -48,10 +51,11 @@ public class DeclarationParser { marker.drop(); builder.advanceLexer(); + final PsiBuilder builderWrapper = braceMatchingBuilder(builder); if (isEnum) { - parseEnumConstants(builder); + parseEnumConstants(builderWrapper); } - parseClassBodyDeclarations(builder, isAnnotation); + parseClassBodyDeclarations(builderWrapper, isAnnotation); expectOrError(builder, JavaTokenType.RBRACE, JavaErrorMessages.message("expected.rbrace")); @@ -189,7 +193,7 @@ public class DeclarationParser { final PsiBuilder.Marker modList = parseModifierList(builder); if (expect(builder, JavaTokenType.AT)) { - if (tokenType == JavaTokenType.INTERFACE_KEYWORD) { + if (builder.getTokenType() == JavaTokenType.INTERFACE_KEYWORD) { return parseClassFromKeyword(builder, declaration, true); } else { @@ -197,9 +201,8 @@ public class DeclarationParser { return null; } } - else if (ElementType.CLASS_KEYWORD_BIT_SET.contains(tokenType)) { + else if (ElementType.CLASS_KEYWORD_BIT_SET.contains(builder.getTokenType())) { final PsiBuilder.Marker root = parseClassFromKeyword(builder, declaration, false); - if (context == Context.FILE) { // todo: append following declarations to root boolean declarationsAfterEnd = false; @@ -233,18 +236,100 @@ public class DeclarationParser { } if (context == Context.FILE) { - if (typeParams == null) { - error(builder, JavaErrorMessages.message("expected.class.or.interface")); - } - else { - typeParams.precede().errorBefore(JavaErrorMessages.message("expected.class.or.interface"), typeParams); - } + error(builder, JavaErrorMessages.message("expected.class.or.interface"), typeParams); declaration.drop(); return modList; } - // todo: implement - throw new UnsupportedOperationException(builder.toString() + context); + PsiBuilder.Marker type; + if (ElementType.PRIMITIVE_TYPE_BIT_SET.contains(builder.getTokenType())) { + type = parseTypeNotNull(builder); + } + else if (builder.getTokenType() == JavaTokenType.IDENTIFIER) { + final PsiBuilder.Marker idPos = builder.mark(); + type = parseTypeNotNull(builder); + if (builder.getTokenType() == JavaTokenType.LPARENTH) { // constructor + if (context == Context.CODE_BLOCK) { + declaration.rollbackTo(); + return null; + } + idPos.rollbackTo(); + if (typeParams == null) { + emptyElement(type, JavaElementType.TYPE_PARAMETER_LIST); + } + builder.advanceLexer(); + if (builder.getTokenType() != JavaTokenType.LPARENTH) { + declaration.drop(); + return null; + } + parseMethodFromLeftParenth(builder, declaration, false); + return declaration; + } + idPos.drop(); + } + else if (builder.getTokenType() == JavaTokenType.LBRACE) { + if (context == Context.CODE_BLOCK) { + error(builder, JavaErrorMessages.message("expected.identifier.or.type"), typeParams); + declaration.drop(); + return modList; + } + + final PsiBuilder.Marker codeBlock = StatementParser.parseCodeBlock(builder); + LOG.assertTrue(codeBlock != null); + + if (typeParams != null) { + final PsiBuilder.Marker error = typeParams.precede(); + error.errorBefore(JavaErrorMessages.message("unexpected.token"), codeBlock); + } + declaration.done(JavaElementType.CLASS_INITIALIZER); + return declaration; + } + else { + final PsiBuilder.Marker error; + if (typeParams != null) { + error = typeParams.precede(); + } + else { + error = builder.mark(); + } + error.error(JavaErrorMessages.message("expected.identifier.or.type")); + return modList; + } + + if (!expect(builder, JavaTokenType.IDENTIFIER)) { + if (context == Context.CODE_BLOCK /* todo: && modifierList.getFirstChildNode() == null */) { + declaration.rollbackTo(); + return null; + } + else { + if (typeParams != null) { + final PsiBuilder.Marker error = typeParams.precede(); + error.errorBefore(JavaErrorMessages.message("unexpected.token"), type); + } + builder.error(JavaErrorMessages.message("expected.identifier")); + declaration.drop(); + return modList; + } + } + + if (builder.getTokenType() == JavaTokenType.LPARENTH) { + if (context == Context.CLASS || context == Context.ANNOTATION_INTERFACE) { // method + if (typeParams == null) { + emptyElement(type, JavaElementType.TYPE_PARAMETER_LIST); + } + parseMethodFromLeftParenth(builder, declaration, (context == Context.ANNOTATION_INTERFACE)); + return declaration; + } + } + + return parseFieldOrLocalVariable(builder, declaration); + } + + @NotNull + private static PsiBuilder.Marker parseTypeNotNull(final PsiBuilder builder) { + final ReferenceParser.TypeInfo typeInfo = ReferenceParser.parseType(builder); + assert typeInfo != null : builder.getOriginalText(); + return typeInfo.marker; } @NotNull @@ -276,6 +361,17 @@ public class DeclarationParser { return modList; } + private static void parseMethodFromLeftParenth(final PsiBuilder builder, final PsiBuilder.Marker declaration, final boolean anno) { + // todo: implement + throw new UnsupportedOperationException(builder.toString() + declaration + anno); + } + + @Nullable + private static PsiBuilder.Marker parseFieldOrLocalVariable(final PsiBuilder builder, final PsiBuilder.Marker declaration) { + // todo: implement + throw new UnsupportedOperationException(builder.toString() + declaration); + } + @Nullable public static PsiBuilder.Marker parseAnnotations(final PsiBuilder builder) { PsiBuilder.Marker firstAnno = null; diff --git a/java/java-impl/src/com/intellij/lang/java/parser/JavaParserUtil.java b/java/java-impl/src/com/intellij/lang/java/parser/JavaParserUtil.java index 73937f311f81..89ed2e5c7fa5 100644 --- a/java/java-impl/src/com/intellij/lang/java/parser/JavaParserUtil.java +++ b/java/java-impl/src/com/intellij/lang/java/parser/JavaParserUtil.java @@ -15,12 +15,16 @@ */ package com.intellij.lang.java.parser; -import com.intellij.lang.PsiBuilder; -import com.intellij.lang.PsiBuilderUtil; +import com.intellij.lang.*; import com.intellij.openapi.util.Key; import com.intellij.pom.java.LanguageLevel; +import com.intellij.psi.JavaTokenType; import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; +import com.intellij.util.diff.FlyweightCapableTreeStructure; +import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class JavaParserUtil { @@ -49,6 +53,15 @@ public class JavaParserUtil { builder.mark().error(message); } + public static void error(final PsiBuilder builder, final String message, @Nullable final PsiBuilder.Marker before) { + if (before == null) { + error(builder, message); + } + else { + before.precede().errorBefore(message, before); + } + } + public static boolean expectOrError(final PsiBuilder builder, final IElementType expectedType, final String errorMessage) { if (!PsiBuilderUtil.expect(builder, expectedType)) { error(builder, errorMessage); @@ -60,4 +73,106 @@ public class JavaParserUtil { public static void emptyElement(final PsiBuilder builder, final IElementType type) { builder.mark().done(type); } + + public static void emptyElement(final PsiBuilder.Marker before, final IElementType type) { + before.precede().done(type); + } + + public static PsiBuilder braceMatchingBuilder(final PsiBuilder builder) { + return new PsiBuilderAdapter(builder) { + private int braceCount = 1; + private int lastOffset = -1; + + @Override + public IElementType getTokenType() { + final IElementType tokenType = super.getTokenType(); + if (getCurrentOffset() != lastOffset) { + if (tokenType == JavaTokenType.LBRACE) { + braceCount++; + } + else if (tokenType == JavaTokenType.RBRACE) { + braceCount--; + } + lastOffset = getCurrentOffset(); + } + return (braceCount == 0 ? null : tokenType); + } + }; + } + + public static class PsiBuilderAdapter implements PsiBuilder { + protected final PsiBuilder myDelegate; + + public PsiBuilderAdapter(final PsiBuilder delegate) { + myDelegate = delegate; + } + + public CharSequence getOriginalText() { + return myDelegate.getOriginalText(); + } + + public void advanceLexer() { + myDelegate.advanceLexer(); + } + + @Nullable + public IElementType getTokenType() { + return myDelegate.getTokenType(); + } + + public void setTokenTypeRemapper(final ITokenTypeRemapper remapper) { + myDelegate.setTokenTypeRemapper(remapper); + } + + @Nullable @NonNls + public String getTokenText() { + return myDelegate.getTokenText(); + } + + public int getCurrentOffset() { + return myDelegate.getCurrentOffset(); + } + + public Marker mark() { + return myDelegate.mark(); + } + + public void error(final String messageText) { + myDelegate.error(messageText); + } + + public boolean eof() { + return myDelegate.eof(); + } + + public ASTNode getTreeBuilt() { + return myDelegate.getTreeBuilt(); + } + + public FlyweightCapableTreeStructure getLightTree() { + return myDelegate.getLightTree(); + } + + public void setDebugMode(final boolean dbgMode) { + myDelegate.setDebugMode(dbgMode); + } + + public void enforceCommentTokens(final TokenSet tokens) { + myDelegate.enforceCommentTokens(tokens); + } + + @Nullable + public LighterASTNode getLatestDoneMarker() { + return myDelegate.getLatestDoneMarker(); + } + + @Nullable + public T getUserData(@NotNull final Key key) { + return myDelegate.getUserData(key); + } + + public void putUserData(@NotNull final Key key, @Nullable final T value) { + myDelegate.putUserData(key, value); + } + } } diff --git a/java/java-impl/src/com/intellij/lang/java/parser/StatementParser.java b/java/java-impl/src/com/intellij/lang/java/parser/StatementParser.java new file mode 100644 index 000000000000..06d8532bd20d --- /dev/null +++ b/java/java-impl/src/com/intellij/lang/java/parser/StatementParser.java @@ -0,0 +1,30 @@ +/* + * Copyright 2000-2010 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.lang.java.parser; + +import com.intellij.lang.PsiBuilder; +import org.jetbrains.annotations.Nullable; + + +public class StatementParser { + private StatementParser() { } + + @Nullable + public static PsiBuilder.Marker parseCodeBlock(final PsiBuilder builder) { + // todo: implement + throw new UnsupportedOperationException(builder.toString()); + } +} diff --git a/java/java-impl/src/com/intellij/psi/impl/source/tree/JavaElementType.java b/java/java-impl/src/com/intellij/psi/impl/source/tree/JavaElementType.java index b2968fa8dbef..c648d69da366 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/tree/JavaElementType.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/tree/JavaElementType.java @@ -93,7 +93,7 @@ public interface JavaElementType { IElementType CLASS_OBJECT_ACCESS_EXPRESSION = new IJavaElementType("CLASS_OBJECT_ACCESS_EXPRESSION"); IElementType EMPTY_EXPRESSION = new IJavaElementType("EMPTY_EXPRESSION"); - IElementType EXPRESSION_LIST = new IJavaElementType("EXPRESSION_LIST"); + IElementType EXPRESSION_LIST = new IJavaElementType("EXPRESSION_LIST", true); IElementType EMPTY_STATEMENT = new IJavaElementType("EMPTY_STATEMENT"); IElementType BLOCK_STATEMENT = new IJavaElementType("BLOCK_STATEMENT"); diff --git a/java/java-tests/testData/psi/parser-partial/declarations/EmptyBody0.txt b/java/java-tests/testData/psi/parser-partial/declarations/EmptyBody0.txt new file mode 100644 index 000000000000..a83166937082 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/EmptyBody0.txt @@ -0,0 +1,4 @@ +PsiJavaFile:EmptyBody0.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') diff --git a/java/java-tests/testData/psi/parser-partial/declarations/EmptyBody1.txt b/java/java-tests/testData/psi/parser-partial/declarations/EmptyBody1.txt new file mode 100644 index 000000000000..60988ad3eee2 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/EmptyBody1.txt @@ -0,0 +1,5 @@ +PsiJavaFile:EmptyBody1.java + PsiJavaToken:LBRACE('{') + PsiErrorElement:'}' expected + + PsiWhiteSpace(' ') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/EnumBody0.txt b/java/java-tests/testData/psi/parser-partial/declarations/EnumBody0.txt new file mode 100644 index 000000000000..a221d652117d --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/EnumBody0.txt @@ -0,0 +1,6 @@ +PsiJavaFile:EnumBody0.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') diff --git a/java/java-tests/testData/psi/parser-partial/declarations/EnumBody1.txt b/java/java-tests/testData/psi/parser-partial/declarations/EnumBody1.txt new file mode 100644 index 000000000000..04b16bc1bcf1 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/EnumBody1.txt @@ -0,0 +1,28 @@ +PsiJavaFile:EnumBody1.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiEnumConstant:RED + PsiModifierList: + + PsiIdentifier:RED('RED') + PsiExpressionList + + PsiJavaToken:COMMA(',') + PsiWhiteSpace(' ') + PsiEnumConstant:GREEN + PsiModifierList: + + PsiIdentifier:GREEN('GREEN') + PsiExpressionList + + PsiJavaToken:COMMA(',') + PsiWhiteSpace(' ') + PsiEnumConstant:BLUE + PsiModifierList: + + PsiIdentifier:BLUE('BLUE') + PsiExpressionList + + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/EnumBody2.txt b/java/java-tests/testData/psi/parser-partial/declarations/EnumBody2.txt new file mode 100644 index 000000000000..0e6471320543 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/EnumBody2.txt @@ -0,0 +1,27 @@ +PsiJavaFile:EnumBody2.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiEnumConstant:RED + PsiModifierList: + + PsiIdentifier:RED('RED') + PsiExpressionList + + PsiJavaToken:COMMA(',') + PsiWhiteSpace(' ') + PsiEnumConstant:GREEN + PsiModifierList: + + PsiIdentifier:GREEN('GREEN') + PsiExpressionList + + PsiJavaToken:COMMA(',') + PsiWhiteSpace(' ') + PsiEnumConstant:BLUE + PsiModifierList: + + PsiIdentifier:BLUE('BLUE') + PsiExpressionList + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/EnumBody3.txt b/java/java-tests/testData/psi/parser-partial/declarations/EnumBody3.txt new file mode 100644 index 000000000000..ea0d456d4d1b --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/EnumBody3.txt @@ -0,0 +1,28 @@ +PsiJavaFile:EnumBody3.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiEnumConstant:RED + PsiModifierList: + + PsiIdentifier:RED('RED') + PsiExpressionList + + PsiJavaToken:COMMA(',') + PsiWhiteSpace(' ') + PsiEnumConstant:GREEN + PsiModifierList: + + PsiIdentifier:GREEN('GREEN') + PsiExpressionList + + PsiJavaToken:COMMA(',') + PsiWhiteSpace(' ') + PsiEnumConstant:BLUE + PsiModifierList: + + PsiIdentifier:BLUE('BLUE') + PsiExpressionList + + PsiJavaToken:COMMA(',') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/EnumBody4.txt b/java/java-tests/testData/psi/parser-partial/declarations/EnumBody4.txt new file mode 100644 index 000000000000..f20ec90ba3f4 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/EnumBody4.txt @@ -0,0 +1,37 @@ +PsiJavaFile:EnumBody4.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiEnumConstant:RED + PsiModifierList: + + PsiIdentifier:RED('RED') + PsiExpressionList + PsiJavaToken:LPARENTH('(') + PsiLiteralExpression:0 + PsiJavaToken:INTEGER_LITERAL('0') + PsiJavaToken:RPARENTH(')') + PsiJavaToken:COMMA(',') + PsiWhiteSpace(' ') + PsiEnumConstant:GREEN + PsiModifierList: + + PsiIdentifier:GREEN('GREEN') + PsiExpressionList + PsiJavaToken:LPARENTH('(') + PsiLiteralExpression:1 + PsiJavaToken:INTEGER_LITERAL('1') + PsiJavaToken:RPARENTH(')') + PsiJavaToken:COMMA(',') + PsiWhiteSpace(' ') + PsiEnumConstant:BLUE + PsiModifierList: + + PsiIdentifier:BLUE('BLUE') + PsiExpressionList + PsiJavaToken:LPARENTH('(') + PsiLiteralExpression:2 + PsiJavaToken:INTEGER_LITERAL('2') + PsiJavaToken:RPARENTH(')') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/EnumBody5.txt b/java/java-tests/testData/psi/parser-partial/declarations/EnumBody5.txt new file mode 100644 index 000000000000..573f3471c668 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/EnumBody5.txt @@ -0,0 +1,22 @@ +PsiJavaFile:EnumBody5.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiEnumConstant:A + PsiModifierList:@ANNOTATION + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:ANNOTATION + PsiIdentifier:ANNOTATION('ANNOTATION') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:A('A') + PsiExpressionList + PsiJavaToken:LPARENTH('(') + PsiLiteralExpression:10 + PsiJavaToken:INTEGER_LITERAL('10') + PsiJavaToken:RPARENTH(')') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java new file mode 100644 index 000000000000..2b5e8486967c --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java @@ -0,0 +1,45 @@ +/* + * Copyright 2000-2010 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.lang.java.parser.partial; + +import com.intellij.lang.PsiBuilder; +import com.intellij.lang.java.parser.DeclarationParser; +import com.intellij.lang.java.parser.JavaParsingTestCase; + + +public class DeclarationParserTest extends JavaParsingTestCase { + public DeclarationParserTest() { + super("parser-partial/declarations"); + } + + public void testEmptyBody0() { doParserTest("{ }", false, false); } + public void testEmptyBody1() { doParserTest("{ ", false, false); } + + public void testEnumBody0() { doParserTest("{ ; }", false, true); } + public void testEnumBody1() { doParserTest("{ RED, GREEN, BLUE; }", false, true); } + public void testEnumBody2() { doParserTest("{ RED, GREEN, BLUE }", false, true); } + public void testEnumBody3() { doParserTest("{ RED, GREEN, BLUE, }", false, true); } + public void testEnumBody4() { doParserTest("{ RED(0), GREEN(1), BLUE(2); }", false, true); } + public void testEnumBody5() { doParserTest("{ @ANNOTATION A(10) }", false, true); } + + private void doParserTest(final String text, final boolean isAnnotation, final boolean isEnum) { + doParserTest(text, new Parser() { + public void parse(final PsiBuilder builder) { + DeclarationParser.parseClassBodyWithBraces(builder, isAnnotation, isEnum); + } + }); + } +} From 72d3a0e47194d958c9f6519c6b24acd6a7d52960 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 26 Jul 2010 20:54:07 +0400 Subject: [PATCH 23/82] New Java parser (work in progress) --- .../lang/java/parser/DeclarationParser.java | 78 +++++++++++++++++-- .../declarations/FieldMulti.txt | 22 ++++++ .../declarations/FieldSimple.txt | 18 +++++ .../declarations/MissingInitializer.txt | 16 ++++ .../MissingInitializerExpression.txt | 16 ++++ .../declarations/MultiLineUnclosed.txt | 23 ++++++ .../declarations/UnclosedBracket.txt | 15 ++++ .../declarations/UnclosedComma.txt | 15 ++++ .../declarations/UnclosedSemicolon.txt | 14 ++++ .../parser/partial/DeclarationParserTest.java | 9 +++ 10 files changed, 220 insertions(+), 6 deletions(-) create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/FieldMulti.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/FieldSimple.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/MissingInitializer.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/MissingInitializerExpression.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/MultiLineUnclosed.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/UnclosedBracket.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/UnclosedComma.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/UnclosedSemicolon.txt diff --git a/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java b/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java index 183accdbf72b..0357b1e11cfe 100644 --- a/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java +++ b/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java @@ -303,8 +303,7 @@ public class DeclarationParser { } else { if (typeParams != null) { - final PsiBuilder.Marker error = typeParams.precede(); - error.errorBefore(JavaErrorMessages.message("unexpected.token"), type); + typeParams.precede().errorBefore(JavaErrorMessages.message("unexpected.token"), type); } builder.error(JavaErrorMessages.message("expected.identifier")); declaration.drop(); @@ -322,7 +321,10 @@ public class DeclarationParser { } } - return parseFieldOrLocalVariable(builder, declaration); + if (typeParams != null) { + typeParams.precede().errorBefore(JavaErrorMessages.message("unexpected.token"), type); + } + return parseFieldOrLocalVariable(builder, declaration, context); } @NotNull @@ -367,9 +369,73 @@ public class DeclarationParser { } @Nullable - private static PsiBuilder.Marker parseFieldOrLocalVariable(final PsiBuilder builder, final PsiBuilder.Marker declaration) { - // todo: implement - throw new UnsupportedOperationException(builder.toString() + declaration); + private static PsiBuilder.Marker parseFieldOrLocalVariable(final PsiBuilder builder, final PsiBuilder.Marker declaration, + final Context context) { + final IElementType varType; + if (context == Context.CLASS || context == Context.ANNOTATION_INTERFACE) { + varType = JavaElementType.FIELD; + } + else if (context == Context.CODE_BLOCK) { + varType = JavaElementType.LOCAL_VARIABLE; + } + else { + LOG.error("Unexpected context: " + context); + declaration.drop(); + return null; + } + + PsiBuilder.Marker variable = declaration; + boolean openMarker = true; + boolean eatSemicolon = true; + boolean expectSemicolon = true; + while (true) { + while (expect(builder, JavaTokenType.LBRACKET)) { + if (!expect(builder, JavaTokenType.RBRACKET)) { + error(builder, JavaErrorMessages.message("expected.rbracket")); + expectSemicolon = false; + break; + } + } + + if (expect(builder, JavaTokenType.EQ)) { + final PsiBuilder.Marker expr = ExpressionParser.parse(builder); + if (expr == null) { + error(builder, JavaErrorMessages.message("expected.expression")); + expectSemicolon = false; + break; + } + } + + if (builder.getTokenType() == JavaTokenType.COMMA) { + variable.done(varType); + builder.advanceLexer(); + variable = builder.mark(); + } + else { + break; + } + + if (!expect(builder, JavaTokenType.IDENTIFIER)) { + variable.drop(); + error(builder, JavaErrorMessages.message("expected.identifier")); + openMarker = false; + eatSemicolon = false; + break; + } + } + + if (eatSemicolon) { + if (!expect(builder, JavaTokenType.SEMICOLON) && expectSemicolon) { + error(builder, JavaErrorMessages.message("expected.semicolon")); + } + // todo: special treatment - see DeclarationParserTest.testMultiLineUnclosed() + } + + if (openMarker) { + variable.done(varType); + } + + return declaration; } @Nullable diff --git a/java/java-tests/testData/psi/parser-partial/declarations/FieldMulti.txt b/java/java-tests/testData/psi/parser-partial/declarations/FieldMulti.txt new file mode 100644 index 000000000000..22138d62d7bf --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/FieldMulti.txt @@ -0,0 +1,22 @@ +PsiJavaFile:FieldMulti.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiField:field1 + PsiModifierList: + + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:field1('field1') + PsiWhiteSpace(' ') + PsiJavaToken:EQ('=') + PsiWhiteSpace(' ') + PsiLiteralExpression:0 + PsiJavaToken:INTEGER_LITERAL('0') + PsiJavaToken:COMMA(',') + PsiWhiteSpace(' ') + PsiField:field2 + PsiIdentifier:field2('field2') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') diff --git a/java/java-tests/testData/psi/parser-partial/declarations/FieldSimple.txt b/java/java-tests/testData/psi/parser-partial/declarations/FieldSimple.txt new file mode 100644 index 000000000000..59dc28ffe43c --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/FieldSimple.txt @@ -0,0 +1,18 @@ +PsiJavaFile:FieldSimple.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiField:field + PsiModifierList: + + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:field('field') + PsiWhiteSpace(' ') + PsiJavaToken:EQ('=') + PsiWhiteSpace(' ') + PsiLiteralExpression:0 + PsiJavaToken:INTEGER_LITERAL('0') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') diff --git a/java/java-tests/testData/psi/parser-partial/declarations/MissingInitializer.txt b/java/java-tests/testData/psi/parser-partial/declarations/MissingInitializer.txt new file mode 100644 index 000000000000..ad9b3b26e18c --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/MissingInitializer.txt @@ -0,0 +1,16 @@ +PsiJavaFile:MissingInitializer.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiField:field + PsiModifierList: + + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:field('field') + PsiWhiteSpace(' ') + PsiJavaToken:EQ('=') + PsiErrorElement:Expression expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') diff --git a/java/java-tests/testData/psi/parser-partial/declarations/MissingInitializerExpression.txt b/java/java-tests/testData/psi/parser-partial/declarations/MissingInitializerExpression.txt new file mode 100644 index 000000000000..e7dac65bea9c --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/MissingInitializerExpression.txt @@ -0,0 +1,16 @@ +PsiJavaFile:MissingInitializerExpression.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiField:field + PsiModifierList: + + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:field('field') + PsiJavaToken:EQ('=') + PsiErrorElement:Expression expected + + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/MultiLineUnclosed.txt b/java/java-tests/testData/psi/parser-partial/declarations/MultiLineUnclosed.txt new file mode 100644 index 000000000000..d44d8913422d --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/MultiLineUnclosed.txt @@ -0,0 +1,23 @@ +PsiJavaFile:MultiLineUnclosed.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiModifierList: + + PsiTypeElement:int + PsiKeyword:int('int') + PsiErrorElement:Identifier expected + + PsiWhiteSpace(' \n ') + PsiField:o + PsiModifierList: + + PsiTypeElement:Object + PsiJavaCodeReferenceElement:Object + PsiIdentifier:Object('Object') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:o('o') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/UnclosedBracket.txt b/java/java-tests/testData/psi/parser-partial/declarations/UnclosedBracket.txt new file mode 100644 index 000000000000..e17119cb9b42 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/UnclosedBracket.txt @@ -0,0 +1,15 @@ +PsiJavaFile:UnclosedBracket.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiField:field + PsiModifierList: + + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:field('field') + PsiJavaToken:LBRACKET('[') + PsiErrorElement:']' expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') diff --git a/java/java-tests/testData/psi/parser-partial/declarations/UnclosedComma.txt b/java/java-tests/testData/psi/parser-partial/declarations/UnclosedComma.txt new file mode 100644 index 000000000000..83f9e32e72d9 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/UnclosedComma.txt @@ -0,0 +1,15 @@ +PsiJavaFile:UnclosedComma.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiField:field + PsiModifierList: + + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:field('field') + PsiJavaToken:COMMA(',') + PsiErrorElement:Identifier expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/UnclosedSemicolon.txt b/java/java-tests/testData/psi/parser-partial/declarations/UnclosedSemicolon.txt new file mode 100644 index 000000000000..f185e9852b30 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/UnclosedSemicolon.txt @@ -0,0 +1,14 @@ +PsiJavaFile:UnclosedSemicolon.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiField:field + PsiModifierList: + + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:field('field') + PsiErrorElement:';' expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java index 2b5e8486967c..7d516c955c89 100644 --- a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java +++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java @@ -35,6 +35,15 @@ public class DeclarationParserTest extends JavaParsingTestCase { public void testEnumBody4() { doParserTest("{ RED(0), GREEN(1), BLUE(2); }", false, true); } public void testEnumBody5() { doParserTest("{ @ANNOTATION A(10) }", false, true); } + public void testFieldSimple() { doParserTest("{ int field = 0; }", false, false); } + public void testFieldMulti() { doParserTest("{ int field1 = 0, field2; }", false, false); } + public void testUnclosedBracket() { doParserTest("{ int field[ }", false, false); } + public void testMissingInitializer() { doParserTest("{ int field = }", false, false); } + public void testUnclosedComma() { doParserTest("{ int field, }", false, false); } + public void testUnclosedSemicolon() { doParserTest("{ int field }", false, false); } + public void testMissingInitializerExpression() { doParserTest("{ int field=; }", false, false); } + //public void testMultiLineUnclosed() { doParserTest("{ int \n Object o; }", false, false); } // todo: implement + private void doParserTest(final String text, final boolean isAnnotation, final boolean isEnum) { doParserTest(text, new Parser() { public void parse(final PsiBuilder builder) { From c2cb3deb5519889ed7dc314233e190925858b9f4 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 27 Jul 2010 12:57:26 +0400 Subject: [PATCH 24/82] New Java parser (work in progress) --- .../lang/java/parser/ReferenceParser.java | 15 +++++++++++++++ .../psi/parser-partial/references/Type5.txt | 11 +++++++++++ .../java/parser/partial/ReferenceParserTest.java | 3 ++- 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/psi/parser-partial/references/Type5.txt diff --git a/java/java-impl/src/com/intellij/lang/java/parser/ReferenceParser.java b/java/java-impl/src/com/intellij/lang/java/parser/ReferenceParser.java index 8831468fabe3..62fa6078d640 100644 --- a/java/java-impl/src/com/intellij/lang/java/parser/ReferenceParser.java +++ b/java/java-impl/src/com/intellij/lang/java/parser/ReferenceParser.java @@ -53,6 +53,21 @@ public class ReferenceParser { return typeInfo != null ? typeInfo.marker : null; } + @Nullable + public static PsiBuilder.Marker parseTypeWithEllipsis(final PsiBuilder builder, final boolean eatLastDot, final boolean wildcard) { + final TypeInfo typeInfo = parseTypeWithInfo(builder, eatLastDot, wildcard); + if (typeInfo == null) return null; + + PsiBuilder.Marker type = typeInfo.marker; + if (builder.getTokenType() == JavaTokenType.ELLIPSIS) { + type = typeInfo.marker.precede(); + builder.advanceLexer(); + type.done(JavaElementType.TYPE); + } + + return type; + } + @Nullable private static TypeInfo parseTypeWithInfo(final PsiBuilder builder, final boolean eatLastDot, final boolean wildcard) { if (builder.getTokenType() == null) return null; diff --git a/java/java-tests/testData/psi/parser-partial/references/Type5.txt b/java/java-tests/testData/psi/parser-partial/references/Type5.txt new file mode 100644 index 000000000000..74a43fc43766 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/references/Type5.txt @@ -0,0 +1,11 @@ +PsiJavaFile:Type5.java + PsiTypeElement:Object[]... + PsiTypeElement:Object[] + PsiTypeElement:Object + PsiJavaCodeReferenceElement:Object + PsiIdentifier:Object('Object') + PsiReferenceParameterList + + PsiJavaToken:LBRACKET('[') + PsiJavaToken:RBRACKET(']') + PsiJavaToken:ELLIPSIS('...') \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ReferenceParserTest.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ReferenceParserTest.java index da5651bf4eb9..77e1e8cb3f1e 100644 --- a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ReferenceParserTest.java +++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ReferenceParserTest.java @@ -34,6 +34,7 @@ public class ReferenceParserTest extends JavaParsingTestCase { public void testType2() { doTypeParserTest("int[]", false); } public void testType3() { doTypeParserTest("int[][", false); } public void testType4() { doTypeParserTest("Map>", false); } + public void testType5() { doTypeParserTest("Object[]...", false); } public void testTypeParams0() { doTypeParamsParserTest(""); } public void testTypeParams1() { doTypeParamsParserTest(""); } @@ -55,7 +56,7 @@ public class ReferenceParserTest extends JavaParsingTestCase { private void doTypeParserTest(final String text, final boolean incomplete) { doParserTest(text, new Parser() { public void parse(final PsiBuilder builder) { - ReferenceParser.parseType(builder, incomplete, false); + ReferenceParser.parseTypeWithEllipsis(builder, incomplete, false); } }); } From 46dad645d85704a8dd865b51a4ea74e37e2c4d02 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 27 Jul 2010 13:11:59 +0400 Subject: [PATCH 25/82] Parser message bundled --- .../intellij/psi/impl/source/parsing/DeclarationParsing.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/psi/impl/source/parsing/DeclarationParsing.java b/java/java-impl/src/com/intellij/psi/impl/source/parsing/DeclarationParsing.java index 95219c560609..8061c0d256e3 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/parsing/DeclarationParsing.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/parsing/DeclarationParsing.java @@ -1086,7 +1086,7 @@ public class DeclarationParsing extends Parsing { if (type == null) { type = ASTFactory.composite(JavaElementType.TYPE); - param.rawAddChildren(Factory.createErrorElement("Parameter type missing")); + param.rawAddChildren(Factory.createErrorElement(JavaErrorMessages.message("expected.type"))); } param.rawAddChildren(type); From fb03ab9d6d883402fea17f4bc92765b77f60fe4d Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 27 Jul 2010 15:18:22 +0400 Subject: [PATCH 26/82] Cleanup --- .../psi/impl/source/parsing/StatementParsing.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/java/java-impl/src/com/intellij/psi/impl/source/parsing/StatementParsing.java b/java/java-impl/src/com/intellij/psi/impl/source/parsing/StatementParsing.java index 89c35b07456f..c706eb3d1bb8 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/parsing/StatementParsing.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/parsing/StatementParsing.java @@ -111,6 +111,7 @@ public class StatementParsing extends Parsing { return dummyRoot.getFirstChildNode(); } + @Nullable public TreeElement parseCodeBlock(Lexer lexer, boolean deep) { if (lexer.getTokenType() != JavaTokenType.LBRACE) return null; Lexer badLexer = lexer instanceof StoppableLexerAdapter ? ((StoppableLexerAdapter)lexer).getDelegate() : lexer; @@ -151,11 +152,10 @@ public class StatementParsing extends Parsing { List list = new SmartList(); while (true) { final IElementType type = lexer.getTokenType(); - if (ElementType.PRIMITIVE_TYPE_BIT_SET.contains(type) || type == JavaTokenType.IDENTIFIER || ElementType.MODIFIER_BIT_SET.contains(type) || - type == JavaTokenType.LT || type == JavaTokenType.GT || type == JavaTokenType.GTGT || type == JavaTokenType.GTGTGT || type == - JavaTokenType.COMMA || type == - JavaTokenType.DOT || - type == JavaTokenType.EXTENDS_KEYWORD || type == JavaTokenType.IMPLEMENTS_KEYWORD) { + if (ElementType.PRIMITIVE_TYPE_BIT_SET.contains(type) || ElementType.MODIFIER_BIT_SET.contains(type) || + type == JavaTokenType.IDENTIFIER || type == JavaTokenType.LT || type == JavaTokenType.GT || + type == JavaTokenType.GTGT || type == JavaTokenType.GTGTGT || type == JavaTokenType.COMMA || + type == JavaTokenType.DOT || type == JavaTokenType.EXTENDS_KEYWORD || type == JavaTokenType.IMPLEMENTS_KEYWORD) { list.add(type); lexer.advance(); } else { From c654288e18b5d5fb677717682bf5e6c0e5806d3a Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 27 Jul 2010 17:38:06 +0400 Subject: [PATCH 27/82] New Java parser (work in progress) --- .../lang/java/parser/DeclarationParser.java | 186 ++++++++++++++++-- .../lang/java/parser/JavaParserUtil.java | 4 +- .../lang/java/parser/ReferenceParser.java | 26 ++- .../lang/java/parser/StatementParser.java | 14 ++ .../declarations/CompletionHack0.txt | 33 ++++ .../declarations/CompletionHack1.txt | 31 +++ .../parser-partial/declarations/Errors.txt | 45 +++++ .../declarations/GenericMethod.txt | 91 +++++++++ .../declarations/GenericMethodErrors.txt | 43 ++++ .../declarations/MethodNormal0.txt | 24 +++ .../declarations/MethodNormal1.txt | 20 ++ .../parser-partial/declarations/Unclosed0.txt | 21 ++ .../parser-partial/declarations/Unclosed1.txt | 22 +++ .../parser-partial/declarations/Unclosed2.txt | 37 ++++ .../parser-partial/declarations/Unclosed3.txt | 29 +++ .../parser-partial/declarations/Unclosed4.txt | 33 ++++ .../parser-partial/declarations/Unclosed5.txt | 30 +++ .../declarations/WildcardParsing.txt | 55 ++++++ .../parser-partial/references/TypeParams5.txt | 4 +- .../parser-partial/references/TypeParams7.txt | 4 +- .../parser/partial/DeclarationParserTest.java | 17 ++ 21 files changed, 730 insertions(+), 39 deletions(-) create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/CompletionHack0.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/CompletionHack1.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/Errors.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/GenericMethod.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/GenericMethodErrors.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/MethodNormal0.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/MethodNormal1.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/Unclosed0.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/Unclosed1.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/Unclosed2.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/Unclosed3.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/Unclosed4.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/Unclosed5.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/WildcardParsing.txt diff --git a/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java b/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java index 0357b1e11cfe..63908d4e6e4c 100644 --- a/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java +++ b/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java @@ -19,6 +19,7 @@ import com.intellij.codeInsight.daemon.JavaErrorMessages; import com.intellij.lang.LighterASTNode; import com.intellij.lang.PsiBuilder; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Pair; import com.intellij.psi.JavaTokenType; import com.intellij.psi.impl.source.tree.ElementType; import com.intellij.psi.impl.source.tree.JavaElementType; @@ -190,7 +191,8 @@ public class DeclarationParser { final PsiBuilder.Marker declaration = builder.mark(); - final PsiBuilder.Marker modList = parseModifierList(builder); + final Pair modListInfo = parseModifierList(builder); + final PsiBuilder.Marker modList = modListInfo.first; if (expect(builder, JavaTokenType.AT)) { if (builder.getTokenType() == JavaTokenType.INTERFACE_KEYWORD) { @@ -255,15 +257,14 @@ public class DeclarationParser { } idPos.rollbackTo(); if (typeParams == null) { - emptyElement(type, JavaElementType.TYPE_PARAMETER_LIST); + emptyElement(builder, JavaElementType.TYPE_PARAMETER_LIST); } builder.advanceLexer(); if (builder.getTokenType() != JavaTokenType.LPARENTH) { - declaration.drop(); + declaration.rollbackTo(); return null; } - parseMethodFromLeftParenth(builder, declaration, false); - return declaration; + return parseMethodFromLeftParenth(builder, declaration, false); } idPos.drop(); } @@ -297,7 +298,7 @@ public class DeclarationParser { } if (!expect(builder, JavaTokenType.IDENTIFIER)) { - if (context == Context.CODE_BLOCK /* todo: && modifierList.getFirstChildNode() == null */) { + if (context == Context.CODE_BLOCK && modListInfo.second) { declaration.rollbackTo(); return null; } @@ -316,8 +317,7 @@ public class DeclarationParser { if (typeParams == null) { emptyElement(type, JavaElementType.TYPE_PARAMETER_LIST); } - parseMethodFromLeftParenth(builder, declaration, (context == Context.ANNOTATION_INTERFACE)); - return declaration; + return parseMethodFromLeftParenth(builder, declaration, (context == Context.ANNOTATION_INTERFACE)); } } @@ -335,14 +335,16 @@ public class DeclarationParser { } @NotNull - private static PsiBuilder.Marker parseModifierList(final PsiBuilder builder) { + private static Pair parseModifierList(final PsiBuilder builder) { final PsiBuilder.Marker modList = builder.mark(); + boolean isEmpty = true; while (true) { final IElementType tokenType = builder.getTokenType(); if (tokenType == null) break; if (ElementType.MODIFIER_BIT_SET.contains(tokenType)) { builder.advanceLexer(); + isEmpty = false; } else if (tokenType == JavaTokenType.AT) { final PsiBuilder.Marker pos = builder.mark(); @@ -353,6 +355,7 @@ public class DeclarationParser { break; } parseAnnotation(builder); + isEmpty = false; } else { break; @@ -360,12 +363,149 @@ public class DeclarationParser { } modList.done(JavaElementType.MODIFIER_LIST); - return modList; + return Pair.create(modList, isEmpty); } - private static void parseMethodFromLeftParenth(final PsiBuilder builder, final PsiBuilder.Marker declaration, final boolean anno) { - // todo: implement - throw new UnsupportedOperationException(builder.toString() + declaration + anno); + private static PsiBuilder.Marker parseMethodFromLeftParenth(final PsiBuilder builder, final PsiBuilder.Marker declaration, + final boolean anno) { + parseParameterList(builder); + + eatBrackets(builder); + + if (areTypeAnnotationsSupported(builder)) { + final PsiBuilder.Marker receiver = builder.mark(); + final PsiBuilder.Marker annotations = parseAnnotations(builder); + if (annotations != null) { + receiver.done(JavaElementType.METHOD_RECEIVER); + } + else { + receiver.drop(); + } + } + + ReferenceParser.parseReferenceList(builder, JavaTokenType.THROWS_KEYWORD, JavaElementType.THROWS_LIST, JavaTokenType.COMMA); + + if (anno && expect(builder, JavaTokenType.DEFAULT_KEYWORD)) { + parseAnnotationValue(builder); + } + + final IElementType tokenType = builder.getTokenType(); + if (tokenType == JavaTokenType.SEMICOLON) { + builder.advanceLexer(); + } + else if (tokenType == JavaTokenType.LBRACE) { + StatementParser.parseCodeBlock(builder); + } + else { + error(builder, JavaErrorMessages.message("expected.lbrace.or.semicolon")); + // todo: special treatment - like in fields (DeclarationParserTest.testMultiLineUnclosed()) + } + + declaration.done(anno ? JavaElementType.ANNOTATION_METHOD : JavaElementType.METHOD); + return declaration; + } + + @NotNull + private static PsiBuilder.Marker parseParameterList(final PsiBuilder builder) { + assert builder.getTokenType() == JavaTokenType.LPARENTH : builder.getTokenType(); + final PsiBuilder.Marker paramList = builder.mark(); + builder.advanceLexer(); + + PsiBuilder.Marker invalidElements = null; + boolean commaExpected = false; + int paramCount = 0; + while (true) { + final IElementType tokenType = builder.getTokenType(); + if (tokenType == null || tokenType == JavaTokenType.RPARENTH) { + boolean noLastParam = !commaExpected && paramCount > 0; + if (noLastParam) { + error(builder, JavaErrorMessages.message("expected.identifier.or.type")); + } + if (!expect(builder, JavaTokenType.RPARENTH)) { + if (!noLastParam) { + error(builder, JavaErrorMessages.message("expected.rparen")); + } + } + break; + } + + if (commaExpected) { + if (builder.getTokenType() == JavaTokenType.COMMA) { + commaExpected = false; + if (invalidElements != null) { + invalidElements.error(JavaErrorMessages.message("expected.parameter")); + invalidElements = null; + } + builder.advanceLexer(); + continue; + } + } + else { + final PsiBuilder.Marker param = parseParameter(builder, true); + if (param != null) { + commaExpected = true; + if (invalidElements != null) { + invalidElements.errorBefore(JavaErrorMessages.message("expected.comma"), param); + invalidElements = null; + } + paramCount++; + continue; + } + } + + if (invalidElements == null) { + if (builder.getTokenType() == JavaTokenType.COMMA) { + error(builder, JavaErrorMessages.message("expected.parameter")); + builder.advanceLexer(); + continue; + } + else { + invalidElements = builder.mark(); + } + } + + // adding a reference, not simple tokens allows "Browse .." to work well + final PsiBuilder.Marker ref = ReferenceParser.parseJavaCodeReference(builder, true, true, false); + if (ref == null && builder.getTokenType() != null) { + builder.advanceLexer(); + } + } + + if (invalidElements != null) { + invalidElements.error(commaExpected ? JavaErrorMessages.message("expected.comma") : JavaErrorMessages.message("expected.parameter")); + } + + paramList.done(JavaElementType.PARAMETER_LIST); + return paramList; + } + + @Nullable + private static PsiBuilder.Marker parseParameter(final PsiBuilder builder, final boolean ellipsis) { + final PsiBuilder.Marker param = builder.mark(); + + final Pair modListInfo = parseModifierList(builder); + final PsiBuilder.Marker type = ellipsis ? ReferenceParser.parseTypeWithEllipsis(builder, true, true) : + ReferenceParser.parseType(builder, true, true); + + if (type == null && modListInfo.second) { + param.rollbackTo(); + return null; + } + + if (type == null) { + error(builder, JavaErrorMessages.message("expected.type")); + emptyElement(builder, JavaElementType.TYPE); + } + + if (expect(builder, JavaTokenType.IDENTIFIER)) { + eatBrackets(builder); + } + else { + error(builder, JavaErrorMessages.message("expected.identifier")); + } + + param.done(JavaElementType.PARAMETER); + return param; } @Nullable @@ -389,12 +529,8 @@ public class DeclarationParser { boolean eatSemicolon = true; boolean expectSemicolon = true; while (true) { - while (expect(builder, JavaTokenType.LBRACKET)) { - if (!expect(builder, JavaTokenType.RBRACKET)) { - error(builder, JavaErrorMessages.message("expected.rbracket")); - expectSemicolon = false; - break; - } + if (!eatBrackets(builder)) { + expectSemicolon = false; } if (expect(builder, JavaTokenType.EQ)) { @@ -438,6 +574,16 @@ public class DeclarationParser { return declaration; } + private static boolean eatBrackets(final PsiBuilder builder) { + while (expect(builder, JavaTokenType.LBRACKET)) { + if (!expect(builder, JavaTokenType.RBRACKET)) { + error(builder, JavaErrorMessages.message("expected.rbracket")); + return false; + } + } + return true; + } + @Nullable public static PsiBuilder.Marker parseAnnotations(final PsiBuilder builder) { PsiBuilder.Marker firstAnno = null; @@ -452,6 +598,7 @@ public class DeclarationParser { @NotNull private static PsiBuilder.Marker parseAnnotation(final PsiBuilder builder) { + assert builder.getTokenType() == JavaTokenType.AT : builder.getTokenType(); final PsiBuilder.Marker anno = builder.mark(); builder.advanceLexer(); @@ -570,6 +717,7 @@ public class DeclarationParser { @NotNull private static PsiBuilder.Marker parseAnnotationArrayInitializer(final PsiBuilder builder) { + assert builder.getTokenType() == JavaTokenType.LBRACE : builder.getTokenType(); final PsiBuilder.Marker annoArray = builder.mark(); builder.advanceLexer(); diff --git a/java/java-impl/src/com/intellij/lang/java/parser/JavaParserUtil.java b/java/java-impl/src/com/intellij/lang/java/parser/JavaParserUtil.java index 89ed2e5c7fa5..6a3597e5f897 100644 --- a/java/java-impl/src/com/intellij/lang/java/parser/JavaParserUtil.java +++ b/java/java-impl/src/com/intellij/lang/java/parser/JavaParserUtil.java @@ -44,7 +44,7 @@ public class JavaParserUtil { @NotNull private static LanguageLevel getLanguageLevel(final PsiBuilder builder) { final LanguageLevel level = builder.getUserData(LANG_LEVEL_KEY); - assert level != null; + assert level != null : builder; return level; } @@ -75,7 +75,7 @@ public class JavaParserUtil { } public static void emptyElement(final PsiBuilder.Marker before, final IElementType type) { - before.precede().done(type); + before.precede().doneBefore(type, before); } public static PsiBuilder braceMatchingBuilder(final PsiBuilder builder) { diff --git a/java/java-impl/src/com/intellij/lang/java/parser/ReferenceParser.java b/java/java-impl/src/com/intellij/lang/java/parser/ReferenceParser.java index 62fa6078d640..da8be88afb9e 100644 --- a/java/java-impl/src/com/intellij/lang/java/parser/ReferenceParser.java +++ b/java/java-impl/src/com/intellij/lang/java/parser/ReferenceParser.java @@ -278,28 +278,26 @@ public class ReferenceParser { return null; } - if (expect(builder, JavaTokenType.EXTENDS_KEYWORD)) { - parseReferenceList(builder, JavaElementType.EXTENDS_BOUND_LIST, JavaTokenType.AND); - } - else { - emptyElement(builder, JavaElementType.EXTENDS_BOUND_LIST); - } + parseReferenceList(builder, JavaTokenType.EXTENDS_KEYWORD, JavaElementType.EXTENDS_BOUND_LIST, JavaTokenType.AND); param.done(JavaElementType.TYPE_PARAMETER); return param; } @NotNull - private static PsiBuilder.Marker parseReferenceList(final PsiBuilder builder, final IElementType type, final IElementType delimiter) { + public static PsiBuilder.Marker parseReferenceList(final PsiBuilder builder, final IElementType start, + final IElementType type, final IElementType delimiter) { final PsiBuilder.Marker element = builder.mark(); - while (true) { - final PsiBuilder.Marker classReference = parseJavaCodeReference(builder, true, true, true); - if (classReference == null) { - error(builder, JavaErrorMessages.message("expected.identifier")); - } - if (!expect(builder, delimiter)) { - break; + if (expect(builder, start)) { + while (true) { + final PsiBuilder.Marker classReference = parseJavaCodeReference(builder, true, true, true); + if (classReference == null) { + error(builder, JavaErrorMessages.message("expected.identifier")); + } + if (!expect(builder, delimiter)) { + break; + } } } diff --git a/java/java-impl/src/com/intellij/lang/java/parser/StatementParser.java b/java/java-impl/src/com/intellij/lang/java/parser/StatementParser.java index 06d8532bd20d..d08d0ff88324 100644 --- a/java/java-impl/src/com/intellij/lang/java/parser/StatementParser.java +++ b/java/java-impl/src/com/intellij/lang/java/parser/StatementParser.java @@ -16,6 +16,8 @@ package com.intellij.lang.java.parser; import com.intellij.lang.PsiBuilder; +import com.intellij.psi.JavaTokenType; +import com.intellij.psi.impl.source.tree.JavaElementType; import org.jetbrains.annotations.Nullable; @@ -24,6 +26,18 @@ public class StatementParser { @Nullable public static PsiBuilder.Marker parseCodeBlock(final PsiBuilder builder) { + if (builder.getTokenType() != JavaTokenType.LBRACE) return null; + + final PsiBuilder.Marker codeBlock = builder.mark(); + builder.advanceLexer(); + + // temp + if (builder.getTokenType() == JavaTokenType.RBRACE) { + builder.advanceLexer(); + codeBlock.done(JavaElementType.CODE_BLOCK); + return codeBlock; + } + // todo: implement throw new UnsupportedOperationException(builder.toString()); } diff --git a/java/java-tests/testData/psi/parser-partial/declarations/CompletionHack0.txt b/java/java-tests/testData/psi/parser-partial/declarations/CompletionHack0.txt new file mode 100644 index 000000000000..7b9cfccf79de --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/CompletionHack0.txt @@ -0,0 +1,33 @@ +PsiJavaFile:CompletionHack0.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiField:s + PsiModifierList: + + PsiErrorElement:Unexpected token + PsiTypeParameterList + PsiJavaToken:LT('<') + PsiTypeParameter:X + PsiIdentifier:X('X') + PsiElement(EXTENDS_BOUND_LIST) + + PsiWhiteSpace(' ') + PsiErrorElement:Unexpected identifier + PsiIdentifier:IntelliJIdeaRulezz('IntelliJIdeaRulezz') + PsiJavaToken:GT('>') + PsiWhiteSpace('\n ') + PsiTypeElement:String + PsiJavaCodeReferenceElement:String + PsiIdentifier:String('String') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:s('s') + PsiWhiteSpace(' ') + PsiJavaToken:EQ('=') + PsiWhiteSpace(' ') + PsiLiteralExpression:"" + PsiJavaToken:STRING_LITERAL('""') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/CompletionHack1.txt b/java/java-tests/testData/psi/parser-partial/declarations/CompletionHack1.txt new file mode 100644 index 000000000000..127827743962 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/CompletionHack1.txt @@ -0,0 +1,31 @@ +PsiJavaFile:CompletionHack1.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiField:s + PsiModifierList: + + PsiErrorElement:Unexpected token + PsiTypeParameterList + PsiJavaToken:LT('<') + PsiTypeParameter:X + PsiIdentifier:X('X') + PsiElement(EXTENDS_BOUND_LIST) + + PsiErrorElement:'>' expected. + + PsiWhiteSpace('\n ') + PsiTypeElement:String + PsiJavaCodeReferenceElement:String + PsiIdentifier:String('String') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:s('s') + PsiWhiteSpace(' ') + PsiJavaToken:EQ('=') + PsiWhiteSpace(' ') + PsiLiteralExpression:"" + PsiJavaToken:STRING_LITERAL('""') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/Errors.txt b/java/java-tests/testData/psi/parser-partial/declarations/Errors.txt new file mode 100644 index 000000000000..609379fee3fa --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/Errors.txt @@ -0,0 +1,45 @@ +PsiJavaFile:Errors.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiModifierList:public static + PsiKeyword:public('public') + PsiWhiteSpace(' ') + PsiKeyword:static('static') + PsiWhiteSpace(' ') + PsiErrorElement:Unexpected token + PsiTypeParameterList + PsiJavaToken:LT('<') + PsiTypeParameter:error + PsiIdentifier:error('error') + PsiElement(EXTENDS_BOUND_LIST) + + PsiErrorElement:'>' expected. + + PsiWhiteSpace(' ') + PsiTypeElement:descr + PsiJavaCodeReferenceElement:descr + PsiIdentifier:descr('descr') + PsiReferenceParameterList + + PsiErrorElement:Identifier expected + + PsiErrorElement:Unexpected token + PsiJavaToken:EQ('=') + PsiJavaToken:STRING_LITERAL('"2"') + PsiJavaToken:GT('>') + PsiField:f1 + PsiModifierList:protected + PsiKeyword:protected('protected') + PsiWhiteSpace(' ') + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:f1('f1') + PsiWhiteSpace(' ') + PsiJavaToken:EQ('=') + PsiWhiteSpace(' ') + PsiLiteralExpression:0 + PsiJavaToken:INTEGER_LITERAL('0') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') diff --git a/java/java-tests/testData/psi/parser-partial/declarations/GenericMethod.txt b/java/java-tests/testData/psi/parser-partial/declarations/GenericMethod.txt new file mode 100644 index 000000000000..7504f3612d97 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/GenericMethod.txt @@ -0,0 +1,91 @@ +PsiJavaFile:GenericMethod.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiMethod:test + PsiModifierList:public static + PsiKeyword:public('public') + PsiWhiteSpace(' ') + PsiKeyword:static('static') + PsiWhiteSpace(' ') + PsiTypeParameterList + PsiJavaToken:LT('<') + PsiTypeParameter:E + PsiIdentifier:E('E') + PsiElement(EXTENDS_BOUND_LIST) + + PsiJavaToken:GT('>') + PsiWhiteSpace(' ') + PsiIdentifier:test('test') + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n ') + PsiMethod:test1 + PsiModifierList: + + PsiTypeParameterList + PsiJavaToken:LT('<') + PsiTypeParameter:E + PsiIdentifier:E('E') + PsiElement(EXTENDS_BOUND_LIST) + + PsiJavaToken:GT('>') + PsiWhiteSpace(' ') + PsiTypeElement:void + PsiKeyword:void('void') + PsiWhiteSpace(' ') + PsiIdentifier:test1('test1') + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n ') + PsiMethod:test2 + PsiModifierList: + + PsiTypeParameterList + PsiJavaToken:LT('<') + PsiTypeParameter:E1 + PsiIdentifier:E1('E1') + PsiWhiteSpace(' ') + PsiElement(EXTENDS_BOUND_LIST) + PsiKeyword:extends('extends') + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:Integer + PsiIdentifier:Integer('Integer') + PsiReferenceParameterList + + PsiJavaToken:COMMA(',') + PsiWhiteSpace(' ') + PsiTypeParameter:E2 + PsiIdentifier:E2('E2') + PsiWhiteSpace(' ') + PsiElement(EXTENDS_BOUND_LIST) + PsiKeyword:extends('extends') + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:Runnable + PsiIdentifier:Runnable('Runnable') + PsiReferenceParameterList + + PsiJavaToken:GT('>') + PsiWhiteSpace(' ') + PsiTypeElement:String + PsiJavaCodeReferenceElement:String + PsiIdentifier:String('String') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:test2('test2') + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') diff --git a/java/java-tests/testData/psi/parser-partial/declarations/GenericMethodErrors.txt b/java/java-tests/testData/psi/parser-partial/declarations/GenericMethodErrors.txt new file mode 100644 index 000000000000..5be504737907 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/GenericMethodErrors.txt @@ -0,0 +1,43 @@ +PsiJavaFile:GenericMethodErrors.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiModifierList: + + PsiErrorElement:Unexpected token + PsiTypeParameterList + PsiJavaToken:LT('<') + PsiTypeParameter:Error + PsiIdentifier:Error('Error') + PsiElement(EXTENDS_BOUND_LIST) + + PsiErrorElement:'>' expected. + + PsiWhiteSpace(' ') + PsiTypeElement:sss + PsiJavaCodeReferenceElement:sss + PsiIdentifier:sss('sss') + PsiReferenceParameterList + + PsiErrorElement:Identifier expected + + PsiWhiteSpace(' ') + PsiErrorElement:Unexpected token + PsiJavaToken:DIV('/') + PsiJavaToken:GT('>') + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:test + PsiIdentifier:test('test') + PsiWhiteSpace(' ') + PsiReferenceParameterList + PsiJavaToken:LT('<') + PsiTypeElement:error + PsiJavaCodeReferenceElement:error + PsiIdentifier:error('error') + PsiReferenceParameterList + + PsiJavaToken:GT('>') + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/MethodNormal0.txt b/java/java-tests/testData/psi/parser-partial/declarations/MethodNormal0.txt new file mode 100644 index 000000000000..f2383f5aaae4 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/MethodNormal0.txt @@ -0,0 +1,24 @@ +PsiJavaFile:MethodNormal0.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiMethod:f + PsiModifierList: + + PsiTypeParameterList + + PsiTypeElement:void + PsiKeyword:void('void') + PsiWhiteSpace(' ') + PsiIdentifier:f('f') + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiWhiteSpace(' ') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/MethodNormal1.txt b/java/java-tests/testData/psi/parser-partial/declarations/MethodNormal1.txt new file mode 100644 index 000000000000..b146b9b578d8 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/MethodNormal1.txt @@ -0,0 +1,20 @@ +PsiJavaFile:MethodNormal1.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiMethod:f + PsiModifierList: + + PsiTypeParameterList + + PsiTypeElement:void + PsiKeyword:void('void') + PsiWhiteSpace(' ') + PsiIdentifier:f('f') + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/Unclosed0.txt b/java/java-tests/testData/psi/parser-partial/declarations/Unclosed0.txt new file mode 100644 index 000000000000..9353f05c8052 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/Unclosed0.txt @@ -0,0 +1,21 @@ +PsiJavaFile:Unclosed0.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiMethod:f + PsiModifierList: + + PsiTypeParameterList + + PsiTypeElement:void + PsiKeyword:void('void') + PsiWhiteSpace(' ') + PsiIdentifier:f('f') + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiErrorElement:'{' or ';' expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') diff --git a/java/java-tests/testData/psi/parser-partial/declarations/Unclosed1.txt b/java/java-tests/testData/psi/parser-partial/declarations/Unclosed1.txt new file mode 100644 index 000000000000..c7b4159c5357 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/Unclosed1.txt @@ -0,0 +1,22 @@ +PsiJavaFile:Unclosed1.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiMethod:f + PsiModifierList: + + PsiTypeParameterList + + PsiTypeElement:void + PsiKeyword:void('void') + PsiWhiteSpace(' ') + PsiIdentifier:f('f') + PsiParameterList:( + PsiJavaToken:LPARENTH('(') + PsiErrorElement:')' expected + + PsiReferenceList + + PsiErrorElement:'{' or ';' expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/Unclosed2.txt b/java/java-tests/testData/psi/parser-partial/declarations/Unclosed2.txt new file mode 100644 index 000000000000..b2a0dfe174c4 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/Unclosed2.txt @@ -0,0 +1,37 @@ +PsiJavaFile:Unclosed2.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiMethod:f + PsiModifierList: + + PsiTypeParameterList + + PsiTypeElement:void + PsiKeyword:void('void') + PsiWhiteSpace(' ') + PsiIdentifier:f('f') + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiErrorElement:'{' or ';' expected + + PsiWhiteSpace('\n ') + PsiMethod:g + PsiModifierList: + + PsiTypeParameterList + + PsiTypeElement:void + PsiKeyword:void('void') + PsiWhiteSpace(' ') + PsiIdentifier:g('g') + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') diff --git a/java/java-tests/testData/psi/parser-partial/declarations/Unclosed3.txt b/java/java-tests/testData/psi/parser-partial/declarations/Unclosed3.txt new file mode 100644 index 000000000000..82caa1cf199e --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/Unclosed3.txt @@ -0,0 +1,29 @@ +PsiJavaFile:Unclosed3.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiMethod:f + PsiModifierList: + + PsiTypeParameterList + + PsiTypeElement:void + PsiKeyword:void('void') + PsiWhiteSpace(' ') + PsiIdentifier:f('f') + PsiParameterList:(int a + PsiJavaToken:LPARENTH('(') + PsiParameter:a + PsiModifierList: + + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:a('a') + PsiErrorElement:')' expected + + PsiReferenceList + + PsiErrorElement:'{' or ';' expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/Unclosed4.txt b/java/java-tests/testData/psi/parser-partial/declarations/Unclosed4.txt new file mode 100644 index 000000000000..d7ffeea84e44 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/Unclosed4.txt @@ -0,0 +1,33 @@ +PsiJavaFile:Unclosed4.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiMethod:f + PsiModifierList: + + PsiTypeParameterList + + PsiTypeElement:void + PsiKeyword:void('void') + PsiWhiteSpace(' ') + PsiIdentifier:f('f') + PsiParameterList:(int a,, + PsiJavaToken:LPARENTH('(') + PsiParameter:a + PsiModifierList: + + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:a('a') + PsiJavaToken:COMMA(',') + PsiErrorElement:Parameter expected + + PsiJavaToken:COMMA(',') + PsiErrorElement:Identifier or type expected + + PsiReferenceList + + PsiErrorElement:'{' or ';' expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/Unclosed5.txt b/java/java-tests/testData/psi/parser-partial/declarations/Unclosed5.txt new file mode 100644 index 000000000000..a0166d829e10 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/Unclosed5.txt @@ -0,0 +1,30 @@ +PsiJavaFile:Unclosed5.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiMethod:f + PsiModifierList: + + PsiTypeParameterList + + PsiTypeElement:void + PsiKeyword:void('void') + PsiWhiteSpace(' ') + PsiIdentifier:f('f') + PsiParameterList:(int a,) + PsiJavaToken:LPARENTH('(') + PsiParameter:a + PsiModifierList: + + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:a('a') + PsiJavaToken:COMMA(',') + PsiErrorElement:Identifier or type expected + + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') diff --git a/java/java-tests/testData/psi/parser-partial/declarations/WildcardParsing.txt b/java/java-tests/testData/psi/parser-partial/declarations/WildcardParsing.txt new file mode 100644 index 000000000000..b433896f20bb --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/WildcardParsing.txt @@ -0,0 +1,55 @@ +PsiJavaFile:WildcardParsing.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiMethod:x + PsiModifierList: + + PsiTypeParameterList + + PsiTypeElement:List + PsiJavaCodeReferenceElement:List + PsiIdentifier:List('List') + PsiReferenceParameterList + PsiJavaToken:LT('<') + PsiTypeElement:? extends B + PsiJavaToken:QUEST('?') + PsiWhiteSpace(' ') + PsiKeyword:extends('extends') + PsiWhiteSpace(' ') + PsiTypeElement:B + PsiJavaCodeReferenceElement:B + PsiIdentifier:B('B') + PsiReferenceParameterList + + PsiJavaToken:GT('>') + PsiWhiteSpace(' ') + PsiIdentifier:x('x') + PsiParameterList:(Collection x) + PsiJavaToken:LPARENTH('(') + PsiParameter:x + PsiModifierList: + + PsiTypeElement:Collection + PsiJavaCodeReferenceElement:Collection + PsiIdentifier:Collection('Collection') + PsiReferenceParameterList + PsiJavaToken:LT('<') + PsiTypeElement:? super B + PsiJavaToken:QUEST('?') + PsiWhiteSpace(' ') + PsiKeyword:super('super') + PsiWhiteSpace(' ') + PsiTypeElement:B + PsiJavaCodeReferenceElement:B + PsiIdentifier:B('B') + PsiReferenceParameterList + + PsiJavaToken:GT('>') + PsiWhiteSpace(' ') + PsiIdentifier:x('x') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/references/TypeParams5.txt b/java/java-tests/testData/psi/parser-partial/references/TypeParams5.txt index 51d776e6a39e..a7329da61f08 100644 --- a/java/java-tests/testData/psi/parser-partial/references/TypeParams5.txt +++ b/java/java-tests/testData/psi/parser-partial/references/TypeParams5.txt @@ -4,9 +4,9 @@ PsiJavaFile:TypeParams5.java PsiTypeParameter:T PsiIdentifier:T('T') PsiWhiteSpace(' ') - PsiKeyword:extends('extends') - PsiWhiteSpace(' ') PsiElement(EXTENDS_BOUND_LIST) + PsiKeyword:extends('extends') + PsiWhiteSpace(' ') PsiJavaCodeReferenceElement:X PsiIdentifier:X('X') PsiReferenceParameterList diff --git a/java/java-tests/testData/psi/parser-partial/references/TypeParams7.txt b/java/java-tests/testData/psi/parser-partial/references/TypeParams7.txt index f3cf0196d19a..aaea7b8c3d5d 100644 --- a/java/java-tests/testData/psi/parser-partial/references/TypeParams7.txt +++ b/java/java-tests/testData/psi/parser-partial/references/TypeParams7.txt @@ -4,9 +4,9 @@ PsiJavaFile:TypeParams7.java PsiTypeParameter:T PsiIdentifier:T('T') PsiWhiteSpace(' ') - PsiKeyword:extends('extends') - PsiWhiteSpace(' ') PsiElement(EXTENDS_BOUND_LIST) + PsiKeyword:extends('extends') + PsiWhiteSpace(' ') PsiJavaCodeReferenceElement:X PsiIdentifier:X('X') PsiReferenceParameterList diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java index 7d516c955c89..577e74a93c53 100644 --- a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java +++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java @@ -44,6 +44,23 @@ public class DeclarationParserTest extends JavaParsingTestCase { public void testMissingInitializerExpression() { doParserTest("{ int field=; }", false, false); } //public void testMultiLineUnclosed() { doParserTest("{ int \n Object o; }", false, false); } // todo: implement + //public void testMethodNormal0() { doParserTest("{ void f() { } }", false, false); } // todo: parse code block correctly + public void testMethodNormal1() { doParserTest("{ void f(); }", false, false); } + public void testUnclosed0() { doParserTest("{ void f() }", false, false); } + public void testUnclosed1() { doParserTest("{ void f( }", false, false); } + public void testUnclosed2() { doParserTest("{ void f()\n void g(); }", false, false); } + public void testUnclosed3() { doParserTest("{ void f(int a }", false, false); } + public void testUnclosed4() { doParserTest("{ void f(int a,, }", false, false); } + public void testUnclosed5() { doParserTest("{ void f(int a,); }", false, false); } + public void testGenericMethod() { doParserTest("{ public static test();\n" + + " void test1();\n" + + " String test2(); }", false, false); } + public void testGenericMethodErrors() { doParserTest("{ test (); }", false, false); } + public void testErrors() { doParserTest("{ public static protected int f1 = 0; }", false, false); } + public void testCompletionHack0() { doParserTest("{ \n String s = \"\"; }", false, false); } + public void testCompletionHack1() { doParserTest("{ x(Collection x); }", false, false); } + private void doParserTest(final String text, final boolean isAnnotation, final boolean isEnum) { doParserTest(text, new Parser() { public void parse(final PsiBuilder builder) { From 9864bf56806814ff8d799ad30aa14558ea7e2ac6 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 27 Jul 2010 18:17:53 +0400 Subject: [PATCH 28/82] Cleanup --- .../intellij/psi/impl/source/parsing/DeclarationParsing.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/java-impl/src/com/intellij/psi/impl/source/parsing/DeclarationParsing.java b/java/java-impl/src/com/intellij/psi/impl/source/parsing/DeclarationParsing.java index 8061c0d256e3..4f8b677b1fc2 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/parsing/DeclarationParsing.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/parsing/DeclarationParsing.java @@ -705,8 +705,8 @@ public class DeclarationParsing extends Parsing { aClass.rawAddChildren(invalidElementsGroup); while (true) { IElementType tokenType = lexer.getTokenType(); - if (tokenType == JavaTokenType.IDENTIFIER || tokenType == JavaTokenType.COMMA || tokenType == JavaTokenType.EXTENDS_KEYWORD || tokenType == - JavaTokenType.IMPLEMENTS_KEYWORD) { + if (tokenType == JavaTokenType.IDENTIFIER || tokenType == JavaTokenType.COMMA || tokenType == JavaTokenType.EXTENDS_KEYWORD || + tokenType == JavaTokenType.IMPLEMENTS_KEYWORD) { invalidElementsGroup.rawAddChildren(ParseUtil.createTokenElement(lexer, myContext.getCharTable())); } else { From 42c9e53017f8b4dfd2e283aa5afa927c15c42e42 Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 28 Jul 2010 12:14:45 +0400 Subject: [PATCH 29/82] added topic about starting/stopping run configurations --- .../intellij/execution/ExecutionAdapter.java | 45 ++++++ .../intellij/execution/ExecutionListener.java | 38 +++++ .../intellij/execution/ExecutionManager.java | 9 +- .../intellij/execution/RunProfileStarter.java | 33 +++++ .../runners/GenericProgramRunner.java | 44 ++---- .../execution/impl/ExecutionManagerImpl.java | 140 +++++++++++++----- 6 files changed, 237 insertions(+), 72 deletions(-) create mode 100644 platform/lang-api/src/com/intellij/execution/ExecutionAdapter.java create mode 100644 platform/lang-api/src/com/intellij/execution/ExecutionListener.java create mode 100644 platform/lang-api/src/com/intellij/execution/RunProfileStarter.java diff --git a/platform/lang-api/src/com/intellij/execution/ExecutionAdapter.java b/platform/lang-api/src/com/intellij/execution/ExecutionAdapter.java new file mode 100644 index 000000000000..85325b68aeb5 --- /dev/null +++ b/platform/lang-api/src/com/intellij/execution/ExecutionAdapter.java @@ -0,0 +1,45 @@ +/* + * Copyright 2000-2010 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.execution; + +import com.intellij.execution.configurations.RunProfile; +import com.intellij.execution.process.ProcessHandler; +import org.jetbrains.annotations.NotNull; + +/** + * @author nik + */ +public class ExecutionAdapter implements ExecutionListener { + @Override + public void processStarting(@NotNull RunProfile runProfile) { + } + + @Override + public void processNotStarted(@NotNull RunProfile runProfile) { + } + + @Override + public void processStarted(@NotNull RunProfile runProfile, @NotNull ProcessHandler handler) { + } + + @Override + public void processTerminating(@NotNull RunProfile runProfile, @NotNull ProcessHandler handler) { + } + + @Override + public void processTerminated(@NotNull RunProfile runProfile, @NotNull ProcessHandler handler) { + } +} diff --git a/platform/lang-api/src/com/intellij/execution/ExecutionListener.java b/platform/lang-api/src/com/intellij/execution/ExecutionListener.java new file mode 100644 index 000000000000..2e45ef7ac8d7 --- /dev/null +++ b/platform/lang-api/src/com/intellij/execution/ExecutionListener.java @@ -0,0 +1,38 @@ +/* + * Copyright 2000-2010 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.execution; + +import com.intellij.execution.configurations.RunProfile; +import com.intellij.execution.process.ProcessHandler; +import org.jetbrains.annotations.NotNull; + +import java.util.EventListener; + +/** + * @author nik + */ +public interface ExecutionListener extends EventListener { + + void processStarting(@NotNull RunProfile runProfile); + + void processNotStarted(@NotNull RunProfile runProfile); + + void processStarted(@NotNull RunProfile runProfile, @NotNull ProcessHandler handler); + + void processTerminating(@NotNull RunProfile runProfile, @NotNull ProcessHandler handler); + + void processTerminated(@NotNull RunProfile runProfile, @NotNull ProcessHandler handler); +} diff --git a/platform/lang-api/src/com/intellij/execution/ExecutionManager.java b/platform/lang-api/src/com/intellij/execution/ExecutionManager.java index 58e02af4f707..712d12c9f4a9 100644 --- a/platform/lang-api/src/com/intellij/execution/ExecutionManager.java +++ b/platform/lang-api/src/com/intellij/execution/ExecutionManager.java @@ -18,10 +18,16 @@ package com.intellij.execution; import com.intellij.execution.configurations.RunProfile; import com.intellij.execution.configurations.RunProfileState; import com.intellij.execution.process.ProcessHandler; +import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.ui.RunContentManager; import com.intellij.openapi.project.Project; +import com.intellij.util.messages.Topic; +import org.jetbrains.annotations.NotNull; public abstract class ExecutionManager { + public static final Topic EXECUTION_TOPIC = new Topic("configuration executed", ExecutionListener.class, + Topic.BroadcastDirection.TO_PARENT); + public static ExecutionManager getInstance(final Project project) { return project.getComponent(ExecutionManager.class); } @@ -32,5 +38,6 @@ public abstract class ExecutionManager { public abstract ProcessHandler[] getRunningProcesses(); - + public abstract void startRunProfile(@NotNull RunProfileStarter starter, @NotNull RunProfileState state, + @NotNull Project project, @NotNull Executor executor, @NotNull ExecutionEnvironment env); } diff --git a/platform/lang-api/src/com/intellij/execution/RunProfileStarter.java b/platform/lang-api/src/com/intellij/execution/RunProfileStarter.java new file mode 100644 index 000000000000..846b67b2f8a5 --- /dev/null +++ b/platform/lang-api/src/com/intellij/execution/RunProfileStarter.java @@ -0,0 +1,33 @@ +/* + * Copyright 2000-2010 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.execution; + +import com.intellij.execution.configurations.RunProfileState; +import com.intellij.execution.runners.ExecutionEnvironment; +import com.intellij.execution.ui.RunContentDescriptor; +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author nik + */ +public abstract class RunProfileStarter { + @Nullable + public abstract RunContentDescriptor execute(@NotNull Project project, @NotNull Executor executor, @NotNull RunProfileState state, + @Nullable RunContentDescriptor contentToReuse, @NotNull ExecutionEnvironment env) throws ExecutionException; + +} diff --git a/platform/lang-api/src/com/intellij/execution/runners/GenericProgramRunner.java b/platform/lang-api/src/com/intellij/execution/runners/GenericProgramRunner.java index cfde4926a0b9..8d8550e664cc 100644 --- a/platform/lang-api/src/com/intellij/execution/runners/GenericProgramRunner.java +++ b/platform/lang-api/src/com/intellij/execution/runners/GenericProgramRunner.java @@ -18,12 +18,9 @@ package com.intellij.execution.runners; import com.intellij.execution.*; import com.intellij.execution.configurations.*; -import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.ui.RunContentDescriptor; -import com.intellij.history.LocalHistory; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.DataKey; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.JDOMExternalizable; @@ -67,51 +64,34 @@ public abstract class GenericProgramRunner public void execute(@NotNull final Executor executor, @NotNull final ExecutionEnvironment env, @Nullable final Callback callback) throws ExecutionException { - final RunProfile profile = env.getRunProfile(); final Project project = env.getProject(); if (project == null) { return; } - final RunContentDescriptor reuseContent = - ExecutionManager.getInstance(project).getContentManager().getReuseContent(executor, env.getContentToReuse()); final RunProfileState state = env.getState(executor); if (state == null) { return; } - Runnable startRunnable = new Runnable() { - public void run() { - try { - if (project.isDisposed()) return; - - final RunContentDescriptor descriptor = - doExecute(project, executor, state, reuseContent, env); - - if (callback != null) callback.processStarted(descriptor); - - if (descriptor != null) { - ExecutionManager.getInstance(project).getContentManager().showRunContent(executor, descriptor); - final ProcessHandler processHandler = descriptor.getProcessHandler(); - if (processHandler != null) processHandler.startNotify(); - } - } - catch (ExecutionException e) { - ExecutionUtil.handleExecutionError(project, executor.getToolWindowId(), profile, e); - } + ExecutionManager.getInstance(project).startRunProfile(new RunProfileStarter() { + @Override + public RunContentDescriptor execute(@NotNull Project project, + @NotNull Executor executor, + @NotNull RunProfileState state, + @Nullable RunContentDescriptor contentToReuse, + @NotNull ExecutionEnvironment env) throws ExecutionException { + final RunContentDescriptor descriptor = doExecute(project, executor, state, contentToReuse, env); + if (callback != null) callback.processStarted(descriptor); + return descriptor; } - }; - if (ApplicationManager.getApplication().isUnitTestMode()) { - startRunnable.run(); - } - else { - ExecutionManager.getInstance(project).compileAndRun(startRunnable, profile, state); - } + }, state, project, executor, env); } @Nullable protected abstract RunContentDescriptor doExecute(final Project project, final Executor executor, final RunProfileState state, final RunContentDescriptor contentToReuse, final ExecutionEnvironment env) throws ExecutionException; + } diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java index 9a37209fc431..9f18f4a66c7a 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java @@ -16,14 +16,16 @@ package com.intellij.execution.impl; -import com.intellij.execution.BeforeRunTask; -import com.intellij.execution.BeforeRunTaskProvider; -import com.intellij.execution.ExecutionManager; +import com.intellij.execution.*; import com.intellij.execution.configurations.ConfigurationPerRunnerSettings; import com.intellij.execution.configurations.RunConfiguration; import com.intellij.execution.configurations.RunProfile; import com.intellij.execution.configurations.RunProfileState; +import com.intellij.execution.process.ProcessAdapter; +import com.intellij.execution.process.ProcessEvent; import com.intellij.execution.process.ProcessHandler; +import com.intellij.execution.runners.ExecutionEnvironment; +import com.intellij.execution.runners.ExecutionUtil; import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.execution.ui.RunContentManager; import com.intellij.execution.ui.RunContentManagerImpl; @@ -64,7 +66,8 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom public void projectClosed() { } - public void initComponent() { } + public void initComponent() { + } public void disposeComponent() { } @@ -94,53 +97,112 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom public void compileAndRun(final Runnable startRunnable, final RunProfile configuration, final RunProfileState state) { - final Runnable antAwareRunnable = new Runnable() { - public void run() { - if (configuration instanceof RunConfiguration) { - final RunConfiguration runConfiguration = (RunConfiguration)configuration; - final RunManagerImpl runManager = RunManagerImpl.getInstanceImpl(myProject); + if (configuration instanceof RunConfiguration) { + final RunConfiguration runConfiguration = (RunConfiguration)configuration; + final RunManagerImpl runManager = RunManagerImpl.getInstanceImpl(myProject); - final Map, BeforeRunTask> activeProviders = new LinkedHashMap, BeforeRunTask>(); - for (final BeforeRunTaskProvider provider : Extensions.getExtensions(BeforeRunTaskProvider.EXTENSION_POINT_NAME, myProject)) { - final BeforeRunTask task = runManager.getBeforeRunTask(runConfiguration, provider.getId()); - if (task != null && task.isEnabled()) { - activeProviders.put(provider, task); + final Map, BeforeRunTask> activeProviders = new LinkedHashMap, BeforeRunTask>(); + for (final BeforeRunTaskProvider provider : Extensions.getExtensions(BeforeRunTaskProvider.EXTENSION_POINT_NAME, myProject)) { + final BeforeRunTask task = runManager.getBeforeRunTask(runConfiguration, provider.getId()); + if (task != null && task.isEnabled()) { + activeProviders.put(provider, task); + } + } + + if (!activeProviders.isEmpty()) { + ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { + public void run() { + ConfigurationPerRunnerSettings configurationSettings = state.getConfigurationSettings(); + DataContext projectContext = SimpleDataContext.getProjectContext(myProject); + + final DataContext dataContext = configurationSettings != null ? SimpleDataContext + .getSimpleContext(BeforeRunTaskProvider.RUNNER_ID, configurationSettings.getRunnerId(), projectContext) : projectContext; + for (BeforeRunTaskProvider provider : activeProviders.keySet()) { + if(!provider.executeTask(dataContext, runConfiguration, activeProviders.get(provider))) { + return; + } + } + DumbService.getInstance(myProject).smartInvokeLater(startRunnable); + } + }); + } + else { + startRunnable.run(); + } + } + else { + startRunnable.run(); + } + } + + @Override + public void startRunProfile(@NotNull final RunProfileStarter starter, @NotNull final RunProfileState state, + @NotNull final Project project, @NotNull final Executor executor, @NotNull final ExecutionEnvironment env) { + final RunContentDescriptor reuseContent = ExecutionManager.getInstance(project).getContentManager().getReuseContent(executor, env.getContentToReuse()); + final RunProfile profile = env.getRunProfile(); + + Runnable startRunnable = new Runnable() { + public void run() { + boolean started = false; + try { + if (project.isDisposed()) return; + + project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processStarting(profile); + + final RunContentDescriptor descriptor = starter.execute(project, executor, state, reuseContent, env); + + if (descriptor != null) { + ExecutionManager.getInstance(project).getContentManager().showRunContent(executor, descriptor); + final ProcessHandler processHandler = descriptor.getProcessHandler(); + if (processHandler != null) { + processHandler.startNotify(); + project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processStarted(profile, processHandler); + started = true; + processHandler.addProcessListener(new ProcessExecutionListener(project, profile, processHandler)); } } - - if (!activeProviders.isEmpty()) { - ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { - public void run() { - ConfigurationPerRunnerSettings configurationSettings = state.getConfigurationSettings(); - DataContext projectContext = SimpleDataContext.getProjectContext(myProject); - - final DataContext dataContext = configurationSettings != null ? SimpleDataContext - .getSimpleContext(BeforeRunTaskProvider.RUNNER_ID, configurationSettings.getRunnerId(), projectContext) : projectContext; - for (BeforeRunTaskProvider provider : activeProviders.keySet()) { - if(!provider.executeTask(dataContext, runConfiguration, activeProviders.get(provider))) { - return; - } - } - DumbService.getInstance(myProject).smartInvokeLater(startRunnable); - } - }); - } - else { - startRunnable.run(); - } } - else { - startRunnable.run(); + catch (ExecutionException e) { + ExecutionUtil.handleExecutionError(project, executor.getToolWindowId(), profile, e); + } + if (!started) { + project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processNotStarted(profile); } } }; - antAwareRunnable.run(); - //ApplicationManager.getApplication().invokeLater(antAwareRunnable); + if (ApplicationManager.getApplication().isUnitTestMode()) { + startRunnable.run(); + } + else { + compileAndRun(startRunnable, profile, state); + } } @NotNull public String getComponentName() { return "ExecutionManager"; } + + private static class ProcessExecutionListener extends ProcessAdapter { + private final Project myProject; + private final RunProfile myProfile; + private final ProcessHandler myProcessHandler; + + public ProcessExecutionListener(Project project, RunProfile profile, ProcessHandler processHandler) { + myProject = project; + myProfile = profile; + myProcessHandler = processHandler; + } + + @Override + public void processTerminated(ProcessEvent event) { + myProject.getMessageBus().syncPublisher(EXECUTION_TOPIC).processTerminated(myProfile, myProcessHandler); + } + + @Override + public void processWillTerminate(ProcessEvent event, boolean willBeDestroyed) { + myProject.getMessageBus().syncPublisher(EXECUTION_TOPIC).processTerminating(myProfile, myProcessHandler); + } + } } From 2ca4baf5164b8a5e30c57fd240236528653a163e Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 27 Jul 2010 21:35:02 +0400 Subject: [PATCH 30/82] eclipse: remember dependency scope for any library --- .../idea/eclipse/conversion/IdeaSpecificSettings.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java index 07ccd9246166..a624a66d326e 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java @@ -115,6 +115,11 @@ public class IdeaSpecificSettings { replaceModuleRelatedRoots(model.getProject(), modifiableModel, libElement, OrderRootType.CLASSES, RELATIVE_MODULE_CLS); replaceModuleRelatedRoots(model.getProject(), modifiableModel, libElement, JavadocOrderRootType.getInstance(), RELATIVE_MODULE_JAVADOC); modifiableModel.commit(); + } else { + final Library library = EclipseClasspathReader.findLibraryByName(model.getProject(), libName); + if (library != null) { + appendLibraryScope(model, libElement, library); + } } } overrideModulesScopes(root, model); From e7420456ab24a467192ebf444be4f8ca093f7652 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 27 Jul 2010 22:21:52 +0400 Subject: [PATCH 31/82] introduce constant: detect write usages (IDEA-53654) --- .../introduceField/IntroduceConstantHandler.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantHandler.java index c2fee31d935a..8c9a56f658f1 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantHandler.java @@ -32,6 +32,7 @@ import com.intellij.refactoring.HelpID; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.ui.TypeSelectorManagerImpl; import com.intellij.refactoring.util.CommonRefactoringUtil; +import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.refactoring.util.classMembers.ClassMemberReferencesVisitor; import com.intellij.refactoring.util.occurences.ExpressionOccurenceManager; import com.intellij.refactoring.util.occurences.OccurenceManager; @@ -85,6 +86,15 @@ public class IntroduceConstantHandler extends BaseExpressionToFieldHandler { PsiExpression[] occurences, PsiElement anchorElement, PsiElement anchorElementIfAll) { + for (PsiExpression occurrence : occurences) { + if (RefactoringUtil.isAssignmentLHS(occurrence)) { + String message = + RefactoringBundle.getCannotRefactorMessage("Selected expression is used for write"); + CommonRefactoringUtil.showErrorHint(project, editor, message, REFACTORING_NAME, getHelpID()); + highlightError(project, editor, occurrence); + return null; + } + } PsiLocalVariable localVariable = null; if (expr instanceof PsiReferenceExpression) { PsiElement ref = ((PsiReferenceExpression)expr).resolve(); From ea83ef22a7f0d5d10083ca1ad1f88f4836d78cbd Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 28 Jul 2010 12:14:45 +0400 Subject: [PATCH 32/82] action button presentation on disabled toolbar should behave appropriate (IDEA-56798) --- .../com/intellij/openapi/actionSystem/impl/ActionButton.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionButton.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionButton.java index 1c9cd34c9350..13e615887cd6 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionButton.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionButton.java @@ -92,7 +92,7 @@ public class ActionButton extends JComponent implements ActionButtonComponent { } protected boolean isButtonEnabled() { - return myPresentation.isEnabled(); + return isEnabled() && myPresentation.isEnabled(); } private void onMousePresenceChanged(boolean setInfo) { From 72fedc5d1f88f6783f4b9da50e2ae89fc1956763 Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 28 Jul 2010 12:53:23 +0400 Subject: [PATCH 33/82] new api for file processing compilers --- .../intellij/compiler/impl/CompileDriver.java | 13 +- .../compiler/impl/CompilerCacheManager.java | 22 ++ .../compiler/impl/NewCompilerRunner.java | 246 ++++++++++++++++++ .../compiler/impl/newApi/BuildTarget.java | 39 +++ .../compiler/impl/newApi/CompileItem.java | 31 +++ .../impl/newApi/CompilerInstance.java | 60 +++++ .../compiler/impl/newApi/NewCompiler.java | 62 +++++ .../impl/newApi/NewCompilerCache.java | 132 ++++++++++ .../newApi/NewCompilerPersistentData.java | 119 +++++++++ .../newApi/SingleTargetCompilerInstance.java | 48 ++++ .../impl/newApi/VirtualFileCompileItem.java | 55 ++++ .../newApi/VirtualFilePersistentState.java | 31 +++ .../newApi/VirtualFileStateExternalizer.java | 44 ++++ 13 files changed, 898 insertions(+), 4 deletions(-) create mode 100644 java/compiler/impl/src/com/intellij/compiler/impl/NewCompilerRunner.java create mode 100644 java/compiler/impl/src/com/intellij/compiler/impl/newApi/BuildTarget.java create mode 100644 java/compiler/impl/src/com/intellij/compiler/impl/newApi/CompileItem.java create mode 100644 java/compiler/impl/src/com/intellij/compiler/impl/newApi/CompilerInstance.java create mode 100644 java/compiler/impl/src/com/intellij/compiler/impl/newApi/NewCompiler.java create mode 100644 java/compiler/impl/src/com/intellij/compiler/impl/newApi/NewCompilerCache.java create mode 100644 java/compiler/impl/src/com/intellij/compiler/impl/newApi/NewCompilerPersistentData.java create mode 100644 java/compiler/impl/src/com/intellij/compiler/impl/newApi/SingleTargetCompilerInstance.java create mode 100644 java/compiler/impl/src/com/intellij/compiler/impl/newApi/VirtualFileCompileItem.java create mode 100644 java/compiler/impl/src/com/intellij/compiler/impl/newApi/VirtualFilePersistentState.java create mode 100644 java/compiler/impl/src/com/intellij/compiler/impl/newApi/VirtualFileStateExternalizer.java 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 230c9e999ec9..5a29390a9e1d 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java @@ -24,6 +24,7 @@ package com.intellij.compiler.impl; import com.intellij.CommonBundle; import com.intellij.analysis.AnalysisScope; import com.intellij.compiler.*; +import com.intellij.compiler.impl.newApi.NewCompiler; import com.intellij.compiler.make.CacheCorruptedException; import com.intellij.compiler.make.CacheUtils; import com.intellij.compiler.make.DependencyCache; @@ -560,7 +561,7 @@ public class CompileDriver { return CompilerBundle.message("status.compilation.completed.successfully.with.warnings.and.errors", errorCount, warningCount); } - private static class ExitStatus { + static class ExitStatus { private final String myName; private ExitStatus(@NonNls String name) { @@ -577,10 +578,10 @@ public class CompileDriver { public static final ExitStatus UP_TO_DATE = new ExitStatus("UP_TO_DATE"); } - private static class ExitException extends Exception { + static class ExitException extends Exception { private final ExitStatus myStatus; - private ExitException(ExitStatus status) { + ExitException(ExitStatus status) { myStatus = status; } @@ -724,7 +725,7 @@ public class CompileDriver { boolean didSomething = false; final CompilerManager compilerManager = CompilerManager.getInstance(myProject); - + NewCompilerRunner runner = new NewCompilerRunner(context, compilerManager, forceCompile, onlyCheckStatus); try { didSomething |= generateSources(compilerManager, context, forceCompile, onlyCheckStatus); @@ -746,19 +747,23 @@ public class CompileDriver { didSomething |= invokeFileProcessingCompilers(compilerManager, context, ClassInstrumentingCompiler.class, FILE_PROCESSING_COMPILER_ADAPTER_FACTORY, isRebuild, false, onlyCheckStatus); + didSomething |= runner.invokeCompilers(NewCompiler.CompileOrderPlace.CLASS_INSTRUMENTING); // explicitly passing forceCompile = false because in scopes that is narrower than ProjectScope it is impossible // to understand whether the class to be processed is in scope or not. Otherwise compiler may process its items even if // there were changes in completely independent files. didSomething |= invokeFileProcessingCompilers(compilerManager, context, ClassPostProcessingCompiler.class, FILE_PROCESSING_COMPILER_ADAPTER_FACTORY, isRebuild, false, onlyCheckStatus); + didSomething |= runner.invokeCompilers(NewCompiler.CompileOrderPlace.CLASS_POST_PROCESSING); didSomething |= invokeFileProcessingCompilers(compilerManager, context, PackagingCompiler.class, FILE_PACKAGING_COMPILER_ADAPTER_FACTORY, isRebuild, false, onlyCheckStatus); + didSomething |= runner.invokeCompilers(NewCompiler.CompileOrderPlace.PACKAGING); didSomething |= invokeFileProcessingCompilers(compilerManager, context, Validator.class, FILE_PROCESSING_COMPILER_ADAPTER_FACTORY, forceCompile, true, onlyCheckStatus); + didSomething |= runner.invokeCompilers(NewCompiler.CompileOrderPlace.VALIDATING); } catch (ExitException e) { if (LOG.isDebugEnabled()) { diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompilerCacheManager.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompilerCacheManager.java index c99dc6f64924..76082f3fbce2 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompilerCacheManager.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompilerCacheManager.java @@ -15,6 +15,8 @@ */ package com.intellij.compiler.impl; +import com.intellij.compiler.impl.newApi.NewCompiler; +import com.intellij.compiler.impl.newApi.NewCompilerCache; import com.intellij.openapi.Disposable; import com.intellij.openapi.compiler.*; import com.intellij.openapi.compiler.Compiler; @@ -42,6 +44,7 @@ import java.util.Map; public class CompilerCacheManager implements ProjectComponent { private static final Logger LOG = Logger.getInstance("#com.intellij.compiler.impl.CompilerCacheManager"); private final Map myCompilerToCacheMap = new HashMap(); + private final Map, NewCompilerCache> myNewCachesMap = new HashMap, NewCompilerCache>(); private final List myCacheDisposables = new ArrayList(); private final File myCachesRoot; private final Runnable myShutdownTask = new Runnable() { @@ -49,8 +52,10 @@ public class CompilerCacheManager implements ProjectComponent { flushCaches(); } }; + private final Project myProject; public CompilerCacheManager(Project project) { + myProject = project; myCachesRoot = CompilerPaths.getCacheStoreDirectory(project); } @@ -85,6 +90,23 @@ public class CompilerCacheManager implements ProjectComponent { return dir; } + public synchronized NewCompilerCache getNewCompilerCache(NewCompiler compiler) throws IOException { + NewCompilerCache cache = myNewCachesMap.get(compiler); + if (cache == null) { + final NewCompilerCache newCache = new NewCompilerCache(compiler, NewCompilerRunner.getNewCompilerCacheDir(myProject, compiler)); + myNewCachesMap.put(compiler, newCache); + myCacheDisposables.add(new Disposable() { + @Override + public void dispose() { + newCache.close(); + } + }); + cache = newCache; + } + //noinspection unchecked + return (NewCompilerCache)cache; + } + public synchronized FileProcessingCompilerStateCache getFileProcessingCompilerCache(FileProcessingCompiler compiler) throws IOException { Object cache = myCompilerToCacheMap.get(compiler); if (cache == null) { diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/NewCompilerRunner.java b/java/compiler/impl/src/com/intellij/compiler/impl/NewCompilerRunner.java new file mode 100644 index 000000000000..a5dc5e2ffc24 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/compiler/impl/NewCompilerRunner.java @@ -0,0 +1,246 @@ +/* + * Copyright 2000-2010 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.compiler.impl; + +import com.intellij.compiler.impl.newApi.*; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.compiler.*; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.progress.ProcessCanceledException; +import com.intellij.openapi.project.DumbService; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.Ref; +import com.intellij.util.CommonProcessors; +import com.intellij.util.Processor; +import com.intellij.util.io.KeyDescriptor; +import gnu.trove.THashSet; +import gnu.trove.TObjectHashingStrategy; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.IOException; +import java.util.*; + +/** + * @author nik + */ +public class NewCompilerRunner { + private static final Logger LOG = Logger.getInstance("#com.intellij.compiler.impl.NewCompilerRunner"); + private CompileContext myContext; + private final boolean myForceCompile; + private final boolean myOnlyCheckStatus; + private final NewCompiler[] myCompilers; + private final Project myProject; + + public NewCompilerRunner(CompileContext context, CompilerManager compilerManager, boolean forceCompile, boolean onlyCheckStatus) { + myContext = context; + myForceCompile = forceCompile; + myOnlyCheckStatus = onlyCheckStatus; + myCompilers = compilerManager.getCompilers(NewCompiler.class); + myProject = myContext.getProject(); + } + + public boolean invokeCompilers(NewCompiler.CompileOrderPlace place) throws CompileDriver.ExitException { + boolean didSomething = false; + try { + for (NewCompiler compiler : myCompilers) { + if (compiler.getOrderPlace().equals(place)) { + didSomething = invokeCompiler(compiler); + } + } + } + catch (IOException e) { + LOG.info(e); + myContext.requestRebuildNextTime(e.getMessage()); + throw new CompileDriver.ExitException(CompileDriver.ExitStatus.ERRORS); + } + catch (CompileDriver.ExitException e) { + throw e; + } + catch (ProcessCanceledException e) { + throw e; + } + catch (Exception e) { + LOG.info(e); + myContext.addMessage(CompilerMessageCategory.ERROR, CompilerBundle.message("compiler.error.exception", e.getMessage()), null, -1, -1); + } + return didSomething; + } + + private boolean invokeCompiler(NewCompiler compiler) throws IOException, CompileDriver.ExitException { + return invokeCompiler(compiler, compiler.createInstance(myContext)); + } + + private , Key, State> + boolean invokeCompiler(NewCompiler compiler, CompilerInstance instance) throws IOException, CompileDriver.ExitException { + NewCompilerCache cache = CompilerCacheManager.getInstance(myProject).getNewCompilerCache(compiler); + NewCompilerPersistentData data = new NewCompilerPersistentData(getNewCompilerCacheDir(myProject, compiler), compiler.getVersion()); + if (data.isVersionChanged()) { + LOG.info("Clearing cache for " + compiler.getDescription()); + cache.wipe(); + } + + Set targetsToRemove = new HashSet(data.getAllTargets()); + for (T target : instance.getAllTargets()) { + targetsToRemove.remove(target.getId()); + } + if (!myOnlyCheckStatus) { + for (String target : targetsToRemove) { + int id = data.removeId(target); + if (LOG.isDebugEnabled()) { + LOG.debug("Removing obsolete target '" + target + "' (id=" + id + ")"); + } + List keys = new ArrayList(); + cache.processSources(id, new CommonProcessors.CollectProcessor(keys)); + List> obsoleteSources = new ArrayList>(); + for (Key key : keys) { + final State state = cache.getState(id, key); + obsoleteSources.add(Pair.create(key, state)); + } + instance.processObsoleteTarget(target, obsoleteSources); + if (myContext.getMessageCount(CompilerMessageCategory.ERROR) > 0) { + return true; + } + for (Key key : keys) { + cache.remove(id, key); + } + } + } + + boolean didSomething = false; + for (T target : instance.getSelectedTargets()) { + int id = data.getId(target.getId()); + didSomething |= processTarget(target, id, compiler, instance, cache); + } + + data.save(); + return didSomething; + } + + public static File getNewCompilerCacheDir(Project project, NewCompiler compiler) { + return new File(CompilerPaths.getCacheStoreDirectory(project), compiler.getId()); + } + + private , Key, State> + boolean processTarget(T target, final int targetId, final NewCompiler compiler, final CompilerInstance instance, + final NewCompilerCache cache) throws IOException, CompileDriver.ExitException { + if (LOG.isDebugEnabled()) { + LOG.debug("Processing target '" + target + "' (id=" + targetId + ")"); + } + final List items = instance.getItems(target); + if (myContext.getMessageCount(CompilerMessageCategory.ERROR) > 0) return true; + + final List> toProcess = new ArrayList>(); + final THashSet keySet = new THashSet(new SourceItemHashingStrategy(compiler)); + final Ref exception = Ref.create(null); + DumbService.getInstance(myProject).waitForSmartMode(); + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + try { + for (Item item : items) { + final Key key = item.getKey(); + keySet.add(key); + State output = cache.getState(targetId, key); + if (myForceCompile || output == null || !item.isUpToDate(output)) { + toProcess.add(Pair.create(item, output)); + } + } + } + catch (IOException e) { + exception.set(e); + } + } + }); + if (!exception.isNull()) { + throw exception.get(); + } + + final List toRemove = new ArrayList(); + cache.processSources(targetId, new Processor() { + @Override + public boolean process(Key key) { + if (!keySet.contains(key)) { + toRemove.add(key); + } + return true; + } + }); + + if (LOG.isDebugEnabled()) { + LOG.debug(toProcess.size() + " items will be processed, " + toRemove.size() + " items will be removed"); + } + + if (toProcess.isEmpty() && toRemove.isEmpty()) { + return false; + } + + if (myOnlyCheckStatus) { + throw new CompileDriver.ExitException(CompileDriver.ExitStatus.CANCELLED); + } + + List> obsoleteItems = new ArrayList>(); + for (Key key : toRemove) { + obsoleteItems.add(Pair.create(key, cache.getState(targetId, key))); + } + + final List processedItems = new ArrayList(); + final List toRefresh = new ArrayList(); + instance.processItems(target, toProcess, obsoleteItems, new CompilerInstance.OutputConsumer() { + @Override + public void addFileToRefresh(@NotNull File file) { + toRefresh.add(file); + } + @Override + public void addProcessedItem(@NotNull Item sourceItem) { + processedItems.add(sourceItem); + } + }); + if (myContext.getMessageCount(CompilerMessageCategory.ERROR) > 0) { + return true; + } + + for (Key key : toRemove) { + cache.remove(targetId, key); + } + CompilerUtil.refreshIOFiles(toRefresh); + for (Item item : processedItems) { + cache.putOutput(targetId, item.getKey(), item.computeState()); + } + + return true; + + } + + private class SourceItemHashingStrategy implements TObjectHashingStrategy { + private KeyDescriptor myKeyDescriptor; + + public SourceItemHashingStrategy(NewCompiler compiler) { + myKeyDescriptor = compiler.getItemKeyDescriptor(); + } + + @Override + public int computeHashCode(S object) { + return myKeyDescriptor.getHashCode(object); + } + + @Override + public boolean equals(S o1, S o2) { + return myKeyDescriptor.isEqual(o1, o2); + } + } +} diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/newApi/BuildTarget.java b/java/compiler/impl/src/com/intellij/compiler/impl/newApi/BuildTarget.java new file mode 100644 index 000000000000..a53ffc1ff9c0 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/compiler/impl/newApi/BuildTarget.java @@ -0,0 +1,39 @@ +/* + * Copyright 2000-2010 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.compiler.impl.newApi; + +import org.jetbrains.annotations.NotNull; + +/** + * @author nik + */ +public abstract class BuildTarget { + public static final BuildTarget DEFAULT = new BuildTarget() { + @NotNull + @Override + public String getId() { + return ""; + } + }; + + @NotNull + public abstract String getId(); + + @Override + public String toString() { + return "Build Target: " + getId(); + } +} diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/newApi/CompileItem.java b/java/compiler/impl/src/com/intellij/compiler/impl/newApi/CompileItem.java new file mode 100644 index 000000000000..fb941ca3e4b2 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/compiler/impl/newApi/CompileItem.java @@ -0,0 +1,31 @@ +/* + * Copyright 2000-2010 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.compiler.impl.newApi; + +import org.jetbrains.annotations.NotNull; + +/** + * @author nik + */ +public abstract class CompileItem { + @NotNull + public abstract Key getKey(); + + public abstract boolean isUpToDate(@NotNull State state); + + @NotNull + public abstract State computeState(); +} diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/newApi/CompilerInstance.java b/java/compiler/impl/src/com/intellij/compiler/impl/newApi/CompilerInstance.java new file mode 100644 index 000000000000..2e9f9cf59593 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/compiler/impl/newApi/CompilerInstance.java @@ -0,0 +1,60 @@ +/* + * Copyright 2000-2010 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.compiler.impl.newApi; + +import com.intellij.openapi.compiler.CompileContext; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Pair; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.util.List; + +/** + * @author nik + */ +public abstract class CompilerInstance, Key, State> { + protected final CompileContext myContext; + + protected CompilerInstance(CompileContext context) { + myContext = context; + } + + protected Project getProject() { + return myContext.getProject(); + } + + @NotNull + public abstract List getAllTargets(); + + @NotNull + public abstract List getSelectedTargets(); + + public abstract void processObsoleteTarget(@NotNull String targetId, @NotNull List> obsoleteItems); + + + @NotNull + public abstract List getItems(@NotNull T target); + + public abstract void processItems(@NotNull T target, @NotNull List> changedItems, @NotNull List> obsoleteItems, + @NotNull OutputConsumer consumer); + + public interface OutputConsumer> { + void addFileToRefresh(@NotNull File file); + + void addProcessedItem(@NotNull Item sourceItem); + } +} diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/newApi/NewCompiler.java b/java/compiler/impl/src/com/intellij/compiler/impl/newApi/NewCompiler.java new file mode 100644 index 000000000000..b82b8bf9d84c --- /dev/null +++ b/java/compiler/impl/src/com/intellij/compiler/impl/newApi/NewCompiler.java @@ -0,0 +1,62 @@ +/* + * Copyright 2000-2010 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.compiler.impl.newApi; + +import com.intellij.openapi.compiler.CompileContext; +import com.intellij.openapi.compiler.Compiler; +import com.intellij.util.io.DataExternalizer; +import com.intellij.util.io.KeyDescriptor; +import org.jetbrains.annotations.NotNull; + +/** + * @author nik + */ +public abstract class NewCompiler implements Compiler { + private final String myId; + private final int myVersion; + private final CompileOrderPlace myOrderPlace; + + protected NewCompiler(@NotNull String id, int version, @NotNull CompileOrderPlace orderPlace) { + myId = id; + myVersion = version; + myOrderPlace = orderPlace; + } + + @NotNull + public abstract KeyDescriptor getItemKeyDescriptor(); + @NotNull + public abstract DataExternalizer getItemStateExternalizer(); + + @NotNull + public abstract CompilerInstance, Key, State> createInstance(@NotNull CompileContext context); + + public final String getId() { + return myId; + } + + public final int getVersion() { + return myVersion; + } + + public CompileOrderPlace getOrderPlace() { + return myOrderPlace; + } + + public static enum CompileOrderPlace { + CLASS_INSTRUMENTING, CLASS_POST_PROCESSING, PACKAGING, VALIDATING + } + +} diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/newApi/NewCompilerCache.java b/java/compiler/impl/src/com/intellij/compiler/impl/newApi/NewCompilerCache.java new file mode 100644 index 000000000000..0b6ea2ecc3e0 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/compiler/impl/newApi/NewCompilerCache.java @@ -0,0 +1,132 @@ +/* + * Copyright 2000-2010 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.compiler.impl.newApi; + +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.util.Processor; +import com.intellij.util.io.KeyDescriptor; +import com.intellij.util.io.PersistentHashMap; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.File; +import java.io.IOException; + +/** + * @author nik + */ +public class NewCompilerCache { + private static final Logger LOG = Logger.getInstance("#com.intellij.compiler.impl.newApi.NewCompilerCache"); + private PersistentHashMap, State> myPersistentMap; + private File myCacheFile; + private final NewCompiler myCompiler; + + public NewCompilerCache(NewCompiler compiler, final File compilerCacheDir) throws IOException { + myCompiler = compiler; + myCacheFile = new File(compilerCacheDir, "timestamps"); + createMap(); + } + + private void createMap() throws IOException { + myPersistentMap = new PersistentHashMap, State>(myCacheFile, new SourceItemDataDescriptor(myCompiler.getItemKeyDescriptor()), + myCompiler.getItemStateExternalizer()); + } + + private KeyAndTargetData getKeyAndTargetData(Key key, int target) { + KeyAndTargetData data = new KeyAndTargetData(); + data.myTarget = target; + data.myKey = key; + return data; + } + + public void wipe() throws IOException { + try { + myPersistentMap.close(); + } + catch (IOException ignored) { + } + PersistentHashMap.deleteFilesStartingWith(myCacheFile); + createMap(); + } + + public void close() { + try { + myPersistentMap.close(); + } + catch (IOException e) { + LOG.info(e); + } + } + + public void remove(int targetId, Key key) throws IOException { + myPersistentMap.remove(getKeyAndTargetData(key, targetId)); + } + + public State getState(int targetId, Key key) throws IOException { + return myPersistentMap.get(getKeyAndTargetData(key, targetId)); + } + + public void processSources(final int targetId, final Processor processor) throws IOException { + myPersistentMap.processKeys(new Processor>() { + @Override + public boolean process(KeyAndTargetData data) { + return targetId == data.myTarget ? processor.process(data.myKey) : true; + } + }); + } + + public void putOutput(int targetId, Key key, State outputItem) throws IOException { + myPersistentMap.put(getKeyAndTargetData(key, targetId), outputItem); + } + + + private static class KeyAndTargetData { + public int myTarget; + public Key myKey; + } + + private class SourceItemDataDescriptor implements KeyDescriptor> { + private final KeyDescriptor myKeyDescriptor; + + public SourceItemDataDescriptor(KeyDescriptor keyDescriptor) { + myKeyDescriptor = keyDescriptor; + } + + @Override + public boolean isEqual(KeyAndTargetData val1, KeyAndTargetData val2) { + return val1.myTarget == val2.myTarget; + } + + @Override + public int getHashCode(KeyAndTargetData value) { + return value.myTarget + 239 * myKeyDescriptor.getHashCode(value.myKey); + } + + @Override + public void save(DataOutput out, KeyAndTargetData value) throws IOException { + out.writeInt(value.myTarget); + myKeyDescriptor.save(out, value.myKey); + } + + + @Override + public KeyAndTargetData read(DataInput in) throws IOException { + int target = in.readInt(); + final Key item = myKeyDescriptor.read(in); + return getKeyAndTargetData(item, target); + } + } +} diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/newApi/NewCompilerPersistentData.java b/java/compiler/impl/src/com/intellij/compiler/impl/newApi/NewCompilerPersistentData.java new file mode 100644 index 000000000000..1746c334cf77 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/compiler/impl/newApi/NewCompilerPersistentData.java @@ -0,0 +1,119 @@ +/* + * Copyright 2000-2010 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.compiler.impl.newApi; + +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.util.io.IOUtil; +import gnu.trove.TIntHashSet; +import org.jetbrains.annotations.NotNull; + +import java.io.*; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * @author nik + */ +public class NewCompilerPersistentData { + private static final Logger LOG = Logger.getInstance("#com.intellij.compiler.impl.newApi.NewCompilerPersistentData"); + private static final int VERSION = 0; + private File myFile; + private Map myTarget2Id = new HashMap(); + private TIntHashSet myUsedIds = new TIntHashSet(); + private boolean myVersionChanged; + private final int myCompilerVersion; + + public NewCompilerPersistentData(File cacheStoreDirectory, int compilerVersion) throws IOException { + myCompilerVersion = compilerVersion; + myFile = new File(cacheStoreDirectory, "info"); + if (!myFile.exists()) { + LOG.info("Compiler info file doesn't exists: " + myFile.getAbsolutePath()); + myVersionChanged = true; + return; + } + + DataInputStream input = new DataInputStream(new FileInputStream(myFile)); + try { + final int dataVersion = input.readInt(); + if (dataVersion != VERSION) { + LOG.info("Version of compiler info file (" + myFile.getAbsolutePath() + ") changed: " + dataVersion + " -> " + VERSION); + myVersionChanged = true; + return; + } + + final int savedCompilerVersion = input.readInt(); + if (savedCompilerVersion != compilerVersion) { + LOG.info("Compiler caches version changed (" + myFile.getAbsolutePath() + "): " + savedCompilerVersion + " -> " + compilerVersion); + myVersionChanged = true; + return; + } + + int size = input.readInt(); + while (size-- > 0) { + final String target = IOUtil.readString(input); + final int id = input.readInt(); + myTarget2Id.put(target, id); + myUsedIds.add(id); + } + } + finally { + input.close(); + } + } + + public boolean isVersionChanged() { + return myVersionChanged; + } + + public void save() throws IOException { + final DataOutputStream output = new DataOutputStream(new FileOutputStream(myFile)); + try { + output.writeInt(VERSION); + output.writeInt(myCompilerVersion); + output.writeInt(myTarget2Id.size()); + + for (Map.Entry entry : myTarget2Id.entrySet()) { + IOUtil.writeString(entry.getKey(), output); + output.writeInt(entry.getValue()); + } + } + finally { + output.close(); + } + } + + public int getId(@NotNull String target) { + if (myTarget2Id.containsKey(target)) { + return myTarget2Id.get(target); + } + int id = 0; + while (myUsedIds.contains(id)) { + id++; + } + myTarget2Id.put(target, id); + myUsedIds.add(id); + return id; + } + + public Set getAllTargets() { + return myTarget2Id.keySet(); + } + + public int removeId(String target) { + return myTarget2Id.remove(target); + } +} diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/newApi/SingleTargetCompilerInstance.java b/java/compiler/impl/src/com/intellij/compiler/impl/newApi/SingleTargetCompilerInstance.java new file mode 100644 index 000000000000..359366e70bb4 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/compiler/impl/newApi/SingleTargetCompilerInstance.java @@ -0,0 +1,48 @@ +/* + * Copyright 2000-2010 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.compiler.impl.newApi; + +import com.intellij.openapi.compiler.CompileContext; +import com.intellij.openapi.util.Pair; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; + +/** + * @author nik + */ +public abstract class SingleTargetCompilerInstance, S, O> extends CompilerInstance { + protected SingleTargetCompilerInstance(CompileContext context) { + super(context); + } + + @NotNull + @Override + public List getAllTargets() { + return Collections.singletonList(BuildTarget.DEFAULT); + } + + @NotNull + @Override + public List getSelectedTargets() { + return getAllTargets(); + } + + @Override + public void processObsoleteTarget(@NotNull String targetId, @NotNull List> obsoleteItems) { + } +} diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/newApi/VirtualFileCompileItem.java b/java/compiler/impl/src/com/intellij/compiler/impl/newApi/VirtualFileCompileItem.java new file mode 100644 index 000000000000..a2c0b7055c9f --- /dev/null +++ b/java/compiler/impl/src/com/intellij/compiler/impl/newApi/VirtualFileCompileItem.java @@ -0,0 +1,55 @@ +/* + * Copyright 2000-2010 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.compiler.impl.newApi; + +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.io.EnumeratorStringDescriptor; +import com.intellij.util.io.KeyDescriptor; +import org.jetbrains.annotations.NotNull; + +/** + * @author nik + */ +public abstract class VirtualFileCompileItem extends CompileItem { + public static final KeyDescriptor KEY_DESCRIPTOR = new EnumeratorStringDescriptor(); + protected final VirtualFile myFile; + + public VirtualFileCompileItem(@NotNull VirtualFile file) { + myFile = file; + } + + @NotNull + public VirtualFile getFile() { + return myFile; + } + + @Override + public final boolean isUpToDate(@NotNull State state) { + if (myFile.getTimeStamp() != state.getSourceTimestamp()) { + return false; + } + return isStateUpToDate(state); + } + + protected abstract boolean isStateUpToDate(State state); + + @NotNull + @Override + public String getKey() { + return myFile.getUrl(); + } + +} diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/newApi/VirtualFilePersistentState.java b/java/compiler/impl/src/com/intellij/compiler/impl/newApi/VirtualFilePersistentState.java new file mode 100644 index 000000000000..9f30a9182e99 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/compiler/impl/newApi/VirtualFilePersistentState.java @@ -0,0 +1,31 @@ +/* + * Copyright 2000-2010 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.compiler.impl.newApi; + +/** +* @author nik +*/ +public class VirtualFilePersistentState { + private final long mySourceTimestamp; + + public VirtualFilePersistentState(long sourceTimestamp) { + mySourceTimestamp = sourceTimestamp; + } + + public final long getSourceTimestamp() { + return mySourceTimestamp; + } +} diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/newApi/VirtualFileStateExternalizer.java b/java/compiler/impl/src/com/intellij/compiler/impl/newApi/VirtualFileStateExternalizer.java new file mode 100644 index 000000000000..6ca460108979 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/compiler/impl/newApi/VirtualFileStateExternalizer.java @@ -0,0 +1,44 @@ +/* + * Copyright 2000-2010 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.compiler.impl.newApi; + +import com.intellij.util.io.DataExternalizer; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +/** +* @author nik +*/ +public abstract class VirtualFileStateExternalizer implements DataExternalizer { + protected abstract void doSave(DataOutput out, State value) throws IOException; + + protected abstract State doRead(DataInput in, long sourceTimestamp) throws IOException; + + @Override + public final void save(DataOutput out, State value) throws IOException { + out.writeLong(value.getSourceTimestamp()); + doSave(out, value); + } + + @Override + public final State read(DataInput in) throws IOException { + final long sourceTimestamp = in.readLong(); + return doRead(in, sourceTimestamp); + } + +} From 6fdc9a7e5752c43d11e6b3b20563dda7c87d4a7b Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 28 Jul 2010 12:54:13 +0400 Subject: [PATCH 34/82] artifacts compiler migrated to new api --- .../compiler/CompilerManagerImpl.java | 2 - .../packagingCompiler/JarDestinationInfo.java | 10 +- ...rtifactAdditionalCompileScopeProvider.java | 2 +- .../impl/compiler/ArtifactBuildTarget.java | 41 ++ .../compiler/ArtifactCompilerCompileItem.java | 86 +++ .../ArtifactPackagingItemExternalizer.java | 54 ++ .../ArtifactPackagingItemOutputState.java | 32 + .../ArtifactPackagingItemValidityState.java | 102 --- .../ArtifactPackagingProcessingItem.java | 96 --- .../impl/compiler/ArtifactsCompiler.java | 88 +++ .../compiler/ArtifactsCompilerInstance.java | 389 ++++++++++++ ...rtifactsProcessingItemsBuilderContext.java | 26 +- .../CopyToDirectoryInstructionCreator.java | 3 +- .../IncrementalArtifactsCompiler.java | 583 ------------------ .../PackIntoArchiveInstructionCreator.java | 7 +- .../BuildArtifactsBeforeRunTaskProvider.java | 4 +- resources/src/META-INF/IdeaPlugin.xml | 1 + 17 files changed, 718 insertions(+), 808 deletions(-) create mode 100644 java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactBuildTarget.java create mode 100644 java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerCompileItem.java create mode 100644 java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingItemExternalizer.java create mode 100644 java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingItemOutputState.java delete mode 100644 java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingItemValidityState.java delete mode 100644 java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingProcessingItem.java create mode 100644 java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactsCompiler.java create mode 100644 java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactsCompilerInstance.java delete mode 100644 java/compiler/impl/src/com/intellij/packaging/impl/compiler/IncrementalArtifactsCompiler.java diff --git a/java/compiler/impl/src/com/intellij/compiler/CompilerManagerImpl.java b/java/compiler/impl/src/com/intellij/compiler/CompilerManagerImpl.java index 1f5fbdf98164..273514938618 100644 --- a/java/compiler/impl/src/com/intellij/compiler/CompilerManagerImpl.java +++ b/java/compiler/impl/src/com/intellij/compiler/CompilerManagerImpl.java @@ -29,7 +29,6 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.packaging.impl.compiler.IncrementalArtifactsCompiler; import com.intellij.util.ArrayUtil; import com.intellij.util.Chunk; import com.intellij.util.containers.ContainerUtil; @@ -68,7 +67,6 @@ public class CompilerManagerImpl extends CompilerManager { addTranslatingCompiler(new JavaCompiler(project), new HashSet(Arrays.asList(StdFileTypes.JAVA)), new HashSet(Arrays.asList(StdFileTypes.CLASS))); addCompiler(new ResourceCompiler(project, compilerConfiguration)); addCompiler(new RmicCompiler()); - addCompiler(new IncrementalArtifactsCompiler()); for(Compiler compiler: Extensions.getExtensions(Compiler.EP_NAME, myProject)) { addCompiler(compiler); diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/JarDestinationInfo.java b/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/JarDestinationInfo.java index 8e0e53a29ff9..5cc45c19278e 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/JarDestinationInfo.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/JarDestinationInfo.java @@ -16,9 +16,9 @@ package com.intellij.compiler.impl.packagingCompiler; -import com.intellij.openapi.deployment.DeploymentUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.JarFileSystem; /** * @author nik @@ -29,12 +29,18 @@ public class JarDestinationInfo extends DestinationInfo { private final JarInfo myJarInfo; public JarDestinationInfo(final String pathInJar, final JarInfo jarInfo, DestinationInfo jarDestination) { - super(DeploymentUtil.appendToPath(jarDestination.getOutputPath(), pathInJar), jarDestination.getOutputFile(), jarDestination.getOutputFilePath()); + super(appendPathInJar(jarDestination.getOutputPath(), pathInJar), jarDestination.getOutputFile(), jarDestination.getOutputFilePath()); LOG.assertTrue(!pathInJar.startsWith(".."), pathInJar); myPathInJar = StringUtil.startsWithChar(pathInJar, '/') ? pathInJar : "/" + pathInJar; myJarInfo = jarInfo; } + private static String appendPathInJar(String outputPath, String pathInJar) { + LOG.assertTrue(outputPath.length() > 0 && outputPath.charAt(outputPath.length() - 1) != '/'); + LOG.assertTrue(pathInJar.length() > 0 && pathInJar.charAt(0) != '/'); + return outputPath + JarFileSystem.JAR_SEPARATOR + pathInJar; + } + public String getPathInJar() { return myPathInJar; } diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactAdditionalCompileScopeProvider.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactAdditionalCompileScopeProvider.java index 6fdbb1d3f33d..78f9c1221117 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactAdditionalCompileScopeProvider.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactAdditionalCompileScopeProvider.java @@ -35,7 +35,7 @@ public class ArtifactAdditionalCompileScopeProvider extends AdditionalCompileSco if (ArtifactCompileScope.getArtifacts(baseScope) != null) { return null; } - final IncrementalArtifactsCompiler compiler = IncrementalArtifactsCompiler.getInstance(project); + final ArtifactsCompiler compiler = ArtifactsCompiler.getInstance(project); if (compiler == null || !filter.acceptCompiler(compiler)) { return null; } diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactBuildTarget.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactBuildTarget.java new file mode 100644 index 000000000000..41aeba8c8516 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactBuildTarget.java @@ -0,0 +1,41 @@ +/* + * Copyright 2000-2010 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.packaging.impl.compiler; + +import com.intellij.compiler.impl.newApi.BuildTarget; +import com.intellij.packaging.artifacts.Artifact; +import org.jetbrains.annotations.NotNull; + +/** + * @author nik + */ +public class ArtifactBuildTarget extends BuildTarget { + private Artifact myArtifact; + + public ArtifactBuildTarget(Artifact artifact) { + myArtifact = artifact; + } + + public Artifact getArtifact() { + return myArtifact; + } + + @NotNull + @Override + public String getId() { + return myArtifact.getName(); + } +} diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerCompileItem.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerCompileItem.java new file mode 100644 index 000000000000..517bef7e89d3 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerCompileItem.java @@ -0,0 +1,86 @@ +/* + * Copyright 2000-2010 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.packaging.impl.compiler; + +import com.intellij.compiler.impl.newApi.VirtualFileCompileItem; +import com.intellij.compiler.impl.packagingCompiler.DestinationInfo; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.SmartList; +import com.intellij.util.io.DataExternalizer; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * @author nik + */ +public class ArtifactCompilerCompileItem extends VirtualFileCompileItem { + public static final DataExternalizer OUTPUT_EXTERNALIZER = new ArtifactPackagingItemExternalizer(); + private final List myDestinations = new SmartList(); + + public ArtifactCompilerCompileItem(VirtualFile file) { + super(file); + } + + public void addDestination(DestinationInfo info) { + myDestinations.add(info); + } + + public List getDestinations() { + return myDestinations; + } + + @NotNull + @Override + public ArtifactPackagingItemOutputState computeState() { + final SmartList> pairs = new SmartList>(); + for (DestinationInfo destination : myDestinations) { + destination.update(); + final VirtualFile outputFile = destination.getOutputFile(); + long timestamp = outputFile != null ? outputFile.getTimeStamp() : -1; + pairs.add(Pair.create(destination.getOutputPath(), timestamp)); + } + return new ArtifactPackagingItemOutputState(myFile.getTimeStamp(), pairs); + } + + @Override + public boolean isStateUpToDate(ArtifactPackagingItemOutputState state) { + final SmartList> cachedDestinations = state.myDestinations; + if (cachedDestinations.size() != myDestinations.size()) { + return false; + } + + for (DestinationInfo info : myDestinations) { + final VirtualFile outputFile = info.getOutputFile(); + long timestamp = outputFile != null ? outputFile.getTimeStamp() : -1; + final String path = info.getOutputPath(); + boolean found = false; + //todo[nik] use map if list contains many items + for (Pair cachedDestination : cachedDestinations) { + if (cachedDestination.first.equals(path)) { + if (cachedDestination.second != timestamp) return false; + found = true; + break; + } + } + if (!found) return false; + } + + return true; + } + +} diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingItemExternalizer.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingItemExternalizer.java new file mode 100644 index 000000000000..f1adc4c406e1 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingItemExternalizer.java @@ -0,0 +1,54 @@ +/* + * Copyright 2000-2010 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.packaging.impl.compiler; + +import com.intellij.compiler.impl.newApi.VirtualFileStateExternalizer; +import com.intellij.openapi.util.Pair; +import com.intellij.util.SmartList; +import com.intellij.util.io.IOUtil; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +/** +* @author nik +*/ +public class ArtifactPackagingItemExternalizer + extends VirtualFileStateExternalizer { + private byte[] myBuffer = IOUtil.allocReadWriteUTFBuffer(); + + @Override + protected void doSave(DataOutput out, ArtifactPackagingItemOutputState value) throws IOException { + out.writeInt(value.myDestinations.size()); + for (Pair pair : value.myDestinations) { + IOUtil.writeUTFFast(myBuffer, out, pair.getFirst()); + out.writeLong(pair.getSecond()); + } + } + + @Override + protected ArtifactPackagingItemOutputState doRead(DataInput in, long sourceTimestamp) throws IOException { + int size = in.readInt(); + SmartList> destinations = new SmartList>(); + while (size-- > 0) { + String path = IOUtil.readUTFFast(myBuffer, in); + long outputTimestamp = in.readLong(); + destinations.add(Pair.create(path, outputTimestamp)); + } + return new ArtifactPackagingItemOutputState(sourceTimestamp, destinations); + } +} diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingItemOutputState.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingItemOutputState.java new file mode 100644 index 000000000000..e93390d6bc72 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingItemOutputState.java @@ -0,0 +1,32 @@ +/* + * Copyright 2000-2010 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.packaging.impl.compiler; + +import com.intellij.compiler.impl.newApi.VirtualFilePersistentState; +import com.intellij.openapi.util.Pair; +import com.intellij.util.SmartList; + +/** +* @author nik +*/ +public class ArtifactPackagingItemOutputState extends VirtualFilePersistentState { + public final SmartList> myDestinations; + + public ArtifactPackagingItemOutputState(long timestamp, SmartList> destinations) { + super(timestamp); + myDestinations = destinations; + } +} diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingItemValidityState.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingItemValidityState.java deleted file mode 100644 index 2dbf9cca5dea..000000000000 --- a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingItemValidityState.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2000-2009 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.packaging.impl.compiler; - -import com.intellij.compiler.impl.packagingCompiler.DestinationInfo; -import com.intellij.openapi.compiler.ValidityState; -import com.intellij.openapi.util.Comparing; -import com.intellij.openapi.util.Pair; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.SmartList; -import com.intellij.util.StringSetSpinAllocator; -import com.intellij.util.io.IOUtil; -import org.jetbrains.annotations.Nullable; - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.util.List; -import java.util.Set; - -/** - * @author nik - */ -public class ArtifactPackagingItemValidityState implements ValidityState { - private final SmartList> myDestinations; - - public ArtifactPackagingItemValidityState(List destinationInfos, boolean sourceFileModified, - @Nullable ArtifactPackagingItemValidityState oldState) { - myDestinations = new SmartList>(); - final Set paths = StringSetSpinAllocator.alloc(); - try { - for (DestinationInfo info : destinationInfos) { - final VirtualFile outputFile = info.getOutputFile(); - long timestamp = outputFile != null ? outputFile.getTimeStamp() : -1; - final String path = info.getOutputPath(); - myDestinations.add(Pair.create(path, timestamp)); - paths.add(path); - } - - if (!sourceFileModified && oldState != null) { - for (Pair pair : oldState.myDestinations) { - if (!paths.contains(pair.getFirst())) { - myDestinations.add(pair); - } - } - } - } - finally { - StringSetSpinAllocator.dispose(paths); - } - } - - public ArtifactPackagingItemValidityState(DataInput input) throws IOException { - int size = input.readInt(); - myDestinations = new SmartList>(); - while (size-- > 0) { - String path = IOUtil.readString(input); - long timestamp = input.readLong(); - myDestinations.add(Pair.create(path, timestamp)); - } - } - - public boolean equalsTo(final ValidityState otherState) { - if (!(otherState instanceof ArtifactPackagingItemValidityState)) { - return false; - } - - final SmartList> otherDestinations = ((ArtifactPackagingItemValidityState)otherState).myDestinations; - if (otherDestinations.size() != myDestinations.size()) { - return false; - } - - if (myDestinations.size() == 1) { - return myDestinations.get(0).equals(otherDestinations.get(0)); - } - - return Comparing.haveEqualElements(myDestinations, otherDestinations); - } - - - public void save(final DataOutput output) throws IOException { - output.writeInt(myDestinations.size()); - for (Pair pair : myDestinations) { - IOUtil.writeString(pair.getFirst(), output); - output.writeLong(pair.getSecond()); - } - } -} \ No newline at end of file diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingProcessingItem.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingProcessingItem.java deleted file mode 100644 index 2054b9978af6..000000000000 --- a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingProcessingItem.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2000-2009 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.packaging.impl.compiler; - -import com.intellij.compiler.impl.FileProcessingCompilerStateCache; -import com.intellij.compiler.impl.packagingCompiler.DestinationInfo; -import com.intellij.openapi.compiler.FileProcessingCompiler; -import com.intellij.openapi.compiler.ValidityState; -import com.intellij.openapi.util.Pair; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.SmartList; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.io.IOException; -import java.util.List; - -/** - * @author nik - */ -public class ArtifactPackagingProcessingItem implements FileProcessingCompiler.ProcessingItem { - private final VirtualFile mySourceFile; - private final List> myDestinations = new SmartList>(); - private List myEnabledDestinations; - private boolean mySourceFileModified; - private ArtifactPackagingItemValidityState myOldState; - - public ArtifactPackagingProcessingItem(final VirtualFile sourceFile) { - mySourceFile = sourceFile; - } - - @NotNull - public VirtualFile getFile() { - return mySourceFile; - } - - public void addDestination(DestinationInfo info, boolean enabled) { - for (int i = 0; i < myDestinations.size(); i++) { - Pair pair = myDestinations.get(i); - if (info.getOutputPath().equals(pair.getFirst().getOutputPath())) { - if (enabled && !pair.getSecond()) { - myDestinations.set(i, Pair.create(info, true)); - } - return; - } - } - myDestinations.add(Pair.create(info, enabled)); - } - - public List> getDestinations() { - return myDestinations; - } - - public void init(FileProcessingCompilerStateCache cache) throws IOException { - final String url = mySourceFile.getUrl(); - myOldState = (ArtifactPackagingItemValidityState)cache.getExtState(url); - mySourceFileModified = cache.getTimestamp(url) != mySourceFile.getTimeStamp(); - } - - public void setProcessed() { - for (DestinationInfo destination : myEnabledDestinations) { - destination.update(); - } - } - - public List getEnabledDestinations() { - if (myEnabledDestinations == null) { - myEnabledDestinations = new SmartList(); - for (Pair destination : myDestinations) { - if (destination.getSecond()) { - myEnabledDestinations.add(destination.getFirst()); - } - } - } - return myEnabledDestinations; - } - - @Nullable - public ValidityState getValidityState() { - return new ArtifactPackagingItemValidityState(getEnabledDestinations(), mySourceFileModified, myOldState); - } -} diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactsCompiler.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactsCompiler.java new file mode 100644 index 000000000000..b410fe456a78 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactsCompiler.java @@ -0,0 +1,88 @@ +/* + * Copyright 2000-2010 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.packaging.impl.compiler; + +import com.intellij.compiler.impl.newApi.CompileItem; +import com.intellij.compiler.impl.newApi.CompilerInstance; +import com.intellij.compiler.impl.newApi.NewCompiler; +import com.intellij.compiler.impl.newApi.VirtualFileCompileItem; +import com.intellij.openapi.compiler.CompileContext; +import com.intellij.openapi.compiler.CompileScope; +import com.intellij.openapi.compiler.CompilerManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Key; +import com.intellij.packaging.artifacts.Artifact; +import com.intellij.util.io.DataExternalizer; +import com.intellij.util.io.KeyDescriptor; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Set; + +/** + * @author nik + */ +public class ArtifactsCompiler extends NewCompiler { + static final Key> WRITTEN_PATHS_KEY = Key.create("artifacts_written_paths"); + static final Key> AFFECTED_ARTIFACTS = Key.create("affected_artifacts"); + + public ArtifactsCompiler() { + super("artifacts_compiler", 0, NewCompiler.CompileOrderPlace.PACKAGING); + } + + @Nullable + public static ArtifactsCompiler getInstance(@NotNull Project project) { + final ArtifactsCompiler[] compilers = CompilerManager.getInstance(project).getCompilers(ArtifactsCompiler.class); + return compilers.length == 1 ? compilers[0] : null; + } + + @NotNull + @Override + public KeyDescriptor getItemKeyDescriptor() { + return VirtualFileCompileItem.KEY_DESCRIPTOR; + } + + @NotNull + @Override + public DataExternalizer getItemStateExternalizer() { + return ArtifactCompilerCompileItem.OUTPUT_EXTERNALIZER; + } + + @NotNull + @Override + public CompilerInstance, String, ArtifactPackagingItemOutputState> createInstance( + @NotNull CompileContext context) { + return new ArtifactsCompilerInstance(context); + } + + public boolean validateConfiguration(final CompileScope scope) { + return true; + } + + @NotNull + public String getDescription() { + return "Artifacts Packaging Compiler"; + } + + public static Set getAffectedArtifacts(final CompileContext compileContext) { + return compileContext.getUserData(AFFECTED_ARTIFACTS); + } + + @Nullable + public static Set getWrittenPaths(@NotNull CompileContext context) { + return context.getUserData(WRITTEN_PATHS_KEY); + } +} diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactsCompilerInstance.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactsCompilerInstance.java new file mode 100644 index 000000000000..f2746de16b45 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactsCompilerInstance.java @@ -0,0 +1,389 @@ +/* + * Copyright 2000-2010 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.packaging.impl.compiler; + +import com.intellij.compiler.CompilerManagerImpl; +import com.intellij.compiler.impl.CompilerUtil; +import com.intellij.compiler.impl.newApi.CompilerInstance; +import com.intellij.compiler.impl.packagingCompiler.*; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.application.Result; +import com.intellij.openapi.compiler.CompileContext; +import com.intellij.openapi.compiler.CompilerBundle; +import com.intellij.openapi.compiler.CompilerMessageCategory; +import com.intellij.openapi.compiler.make.BuildParticipant; +import com.intellij.openapi.compiler.make.BuildParticipantProvider; +import com.intellij.openapi.deployment.DeploymentUtil; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.progress.ProcessCanceledException; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.Ref; +import com.intellij.openapi.util.SystemInfo; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.JarFileSystem; +import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.packaging.artifacts.Artifact; +import com.intellij.packaging.artifacts.ArtifactManager; +import com.intellij.packaging.artifacts.ArtifactProperties; +import com.intellij.packaging.artifacts.ArtifactPropertiesProvider; +import com.intellij.packaging.elements.CompositePackagingElement; +import com.intellij.packaging.elements.PackagingElementResolvingContext; +import com.intellij.packaging.impl.artifacts.ArtifactValidationUtil; +import com.intellij.util.ThrowableRunnable; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.text.CaseInsensitiveStringHashingStrategy; +import gnu.trove.THashSet; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.FileFilter; +import java.io.IOException; +import java.util.*; + +/** + * @author nik + */ +public class ArtifactsCompilerInstance extends CompilerInstance { + private static final Logger LOG = Logger.getInstance("#com.intellij.packaging.impl.compiler.ArtifactsCompilerInstance"); + private ArtifactsProcessingItemsBuilderContext myBuilderContext; + + public ArtifactsCompilerInstance(CompileContext context) { + super(context); + } + + @NotNull + @Override + public List getAllTargets() { + return getArtifactTargets(false); + } + + @NotNull + @Override + public List getSelectedTargets() { + return getArtifactTargets(true); + } + + private List getArtifactTargets(final boolean selectedOnly) { + final List targets = new ArrayList(); + new ReadAction() { + protected void run(final Result result) { + final Set artifacts; + if (selectedOnly) { + artifacts = ArtifactCompileScope.getArtifactsToBuild(getProject(), myContext.getCompileScope()); + } + else { + artifacts = new HashSet(Arrays.asList(ArtifactManager.getInstance(getProject()).getArtifacts())); + } + List additionalArtifacts = new ArrayList(); + for (BuildParticipantProvider provider : BuildParticipantProvider.EXTENSION_POINT_NAME.getExtensions()) { + for (Module module : ModuleManager.getInstance(getProject()).getModules()) { + final Collection participants = provider.getParticipants(module); + for (BuildParticipant participant : participants) { + ContainerUtil.addIfNotNull(participant.createArtifact(myContext), additionalArtifacts); + } + } + } + if (LOG.isDebugEnabled() && !additionalArtifacts.isEmpty()) { + LOG.debug("additional artifacts to build: " + additionalArtifacts); + } + artifacts.addAll(additionalArtifacts); + + for (Artifact artifact : artifacts) { + targets.add(new ArtifactBuildTarget(artifact)); + } + if (selectedOnly) { + myContext.putUserData(ArtifactsCompiler.AFFECTED_ARTIFACTS, artifacts); + } + } + }.execute(); + return targets; + } + + @Override + public void processObsoleteTarget(@NotNull String targetId, @NotNull List> obsoleteItems) { + deleteFiles(obsoleteItems, Collections.>emptyList()); + } + + @NotNull + @Override + public List getItems(@NotNull ArtifactBuildTarget target) { + myBuilderContext = new ArtifactsProcessingItemsBuilderContext(myContext); + final Artifact artifact = target.getArtifact(); + + final Set selfIncludingArtifacts = new ReadAction>() { + protected void run(final Result> result) { + result.setResult(ArtifactValidationUtil.getInstance(getProject()).getSelfIncludingArtifacts()); + } + }.execute().getResultObject(); + if (selfIncludingArtifacts.contains(artifact)) { + myContext.addMessage(CompilerMessageCategory.ERROR, "Artifact '" + artifact.getName() + "' includes itself in the output layout", null, -1, -1); + return Collections.emptyList(); + } + + final String outputPath = artifact.getOutputPath(); + if (outputPath == null || outputPath.length() == 0) { + myContext.addMessage(CompilerMessageCategory.ERROR, "Cannot build '" + artifact.getName() + "' artifact: output path is not specified", + null, -1, -1); + return Collections.emptyList(); + } + + new ReadAction() { + protected void run(final Result result) { + collectItems(artifact, outputPath); + } + }.execute(); + return new ArrayList(myBuilderContext.getProcessingItems()); + } + + private void collectItems(@NotNull Artifact artifact, @NotNull String outputPath) { + final CompositePackagingElement rootElement = artifact.getRootElement(); + final VirtualFile outputFile = LocalFileSystem.getInstance().findFileByPath(outputPath); + final CopyToDirectoryInstructionCreator instructionCreator = new CopyToDirectoryInstructionCreator(myBuilderContext, outputPath, outputFile); + final PackagingElementResolvingContext resolvingContext = ArtifactManager.getInstance(getProject()).getResolvingContext(); + rootElement.computeIncrementalCompilerInstructions(instructionCreator, resolvingContext, myBuilderContext, artifact.getArtifactType()); + } + + private boolean doBuild(final List> changedItems, + final Set processedItems, + final Set writtenPaths, final Set deletedJars) { + final boolean testMode = ApplicationManager.getApplication().isUnitTestMode(); + + final DeploymentUtil deploymentUtil = DeploymentUtil.getInstance(); + final FileFilter fileFilter = new IgnoredFileFilter(); + final Set changedJars = new THashSet(); + for (String deletedJar : deletedJars) { + ContainerUtil.addIfNotNull(myBuilderContext.getJarInfo(deletedJar), changedJars); + } + + try { + onBuildStartedOrFinished(false); + if (myContext.getMessageCount(CompilerMessageCategory.ERROR) > 0) { + return false; + } + + int i = 0; + for (final Pair item : changedItems) { + final ArtifactCompilerCompileItem sourceItem = item.getFirst(); + myContext.getProgressIndicator().checkCanceled(); + + final Ref exception = Ref.create(null); + new ReadAction() { + protected void run(final Result result) { + final File fromFile = VfsUtil.virtualToIoFile(sourceItem.getFile()); + for (DestinationInfo destination : sourceItem.getDestinations()) { + if (destination instanceof ExplodedDestinationInfo) { + final ExplodedDestinationInfo explodedDestination = (ExplodedDestinationInfo)destination; + File toFile = new File(FileUtil.toSystemDependentName(explodedDestination.getOutputPath())); + if (fromFile.exists()) { + try { + deploymentUtil.copyFile(fromFile, toFile, myContext, writtenPaths, fileFilter); + } + catch (IOException e) { + exception.set(e); + return; + } + } + } + else { + changedJars.add(((JarDestinationInfo)destination).getJarInfo()); + } + } + } + }.execute(); + if (exception.get() != null) { + throw exception.get(); + } + + myContext.getProgressIndicator().setFraction(++i * 1.0 / changedItems.size()); + processedItems.add(sourceItem); + if (testMode) { + CompilerManagerImpl.addRecompiledPath(FileUtil.toSystemDependentName(sourceItem.getFile().getPath())); + } + } + + JarsBuilder builder = new JarsBuilder(changedJars, fileFilter, myContext); + final boolean processed = builder.buildJars(writtenPaths); + if (!processed) { + return false; + } + + Set recompiledSources = new HashSet(); + for (JarInfo info : builder.getJarsToBuild()) { + for (Pair pair : info.getPackedFiles()) { + recompiledSources.add(pair.getSecond()); + } + } + for (VirtualFile source : recompiledSources) { + ArtifactCompilerCompileItem item = myBuilderContext.getItemBySource(source); + LOG.assertTrue(item != null, source); + processedItems.add(item); + if (testMode) { + CompilerManagerImpl.addRecompiledPath(FileUtil.toSystemDependentName(item.getFile().getPath())); + } + } + + onBuildStartedOrFinished(true); + } + catch (ProcessCanceledException e) { + throw e; + } + catch (Exception e) { + LOG.info(e); + myContext.addMessage(CompilerMessageCategory.ERROR, e.getLocalizedMessage(), null, -1, -1); + return false; + } + return true; + } + + private void onBuildStartedOrFinished(final boolean finished) throws Exception { + final Set artifacts = myContext.getUserData(ArtifactsCompiler.AFFECTED_ARTIFACTS); + if (artifacts != null) { + for (Artifact artifact : artifacts) { + for (ArtifactPropertiesProvider provider : artifact.getPropertiesProviders()) { + final ArtifactProperties properties = artifact.getProperties(provider); + if (finished) { + properties.onBuildFinished(artifact, myContext); + } + else { + properties.onBuildStarted(artifact, myContext); + } + } + } + } + } + + private static THashSet createPathsHashSet() { + return SystemInfo.isFileSystemCaseSensitive + ? new THashSet() + : new THashSet(CaseInsensitiveStringHashingStrategy.INSTANCE); + } + + @Override + public void processItems(@NotNull ArtifactBuildTarget target, @NotNull final List> changedItems, + @NotNull List> obsoleteItems, + @NotNull final OutputConsumer consumer) { + + final THashSet deletedJars = deleteFiles(obsoleteItems, changedItems); + + final Set writtenPaths = createPathsHashSet(); + final Ref built = Ref.create(false); + final Set processedItems = new HashSet(); + CompilerUtil.runInContext(myContext, "Copying files", new ThrowableRunnable() { + public void run() throws RuntimeException { + built.set(doBuild(changedItems, processedItems, writtenPaths, deletedJars)); + } + }); + if (!built.get()) { + return; + } + + myContext.getProgressIndicator().setText(CompilerBundle.message("packaging.compiler.message.updating.caches")); + myContext.getProgressIndicator().setText2(""); + for (String path : writtenPaths) { + consumer.addFileToRefresh(new File(path)); + } + for (ArtifactCompilerCompileItem item : processedItems) { + consumer.addProcessedItem(item); + } + myContext.putUserData(ArtifactsCompiler.WRITTEN_PATHS_KEY, writtenPaths); + } + + private THashSet deleteFiles(List> obsoleteItems, + List> changedItems) { + myContext.getProgressIndicator().setText(CompilerBundle.message("packaging.compiler.message.deleting.outdated.files")); + + final boolean testMode = ApplicationManager.getApplication().isUnitTestMode(); + final THashSet deletedJars = new THashSet(); + final THashSet notDeletedJars = new THashSet(); + if (LOG.isDebugEnabled()) { + LOG.debug("Deleting outdated files..."); + } + + Set pathToDelete = new THashSet(); + for (Pair item : changedItems) { + final ArtifactPackagingItemOutputState cached = item.getSecond(); + if (cached != null) { + for (Pair destination : cached.myDestinations) { + pathToDelete.add(destination.getFirst()); + } + } + } + for (Pair item : changedItems) { + for (DestinationInfo destination : item.getFirst().getDestinations()) { + pathToDelete.remove(destination.getOutputPath()); + } + } + for (Pair item : obsoleteItems) { + for (Pair destination : item.getSecond().myDestinations) { + pathToDelete.add(destination.getFirst()); + } + } + + int notDeletedFilesCount = 0; + List filesToRefresh = new ArrayList(); + + for (String fullPath : pathToDelete) { + int end = fullPath.indexOf(JarFileSystem.JAR_SEPARATOR); + boolean isJar = end != -1; + String filePath = isJar ? fullPath.substring(0, end) : fullPath; + boolean deleted = false; + if (isJar) { + if (notDeletedJars.contains(filePath)) { + continue; + } + deleted = deletedJars.contains(filePath); + } + + File file = new File(FileUtil.toSystemDependentName(filePath)); + if (!deleted) { + filesToRefresh.add(file); + deleted = FileUtil.delete(file); + } + + if (deleted) { + if (isJar) { + deletedJars.add(filePath); + } + if (testMode) { + CompilerManagerImpl.addDeletedPath(file.getAbsolutePath()); + } + } + else { + if (isJar) { + notDeletedJars.add(filePath); + } + if (notDeletedFilesCount++ > 50) { + myContext.addMessage(CompilerMessageCategory.WARNING, "Deletion of outdated files stopped because too many files cannot be deleted", null, -1, -1); + break; + } + myContext.addMessage(CompilerMessageCategory.WARNING, "Cannot delete file '" + filePath + "'", null, -1, -1); + if (LOG.isDebugEnabled()) { + LOG.debug("Cannot delete file " + file); + } + } + } + + CompilerUtil.refreshIOFiles(filesToRefresh); + return deletedJars; + } + +} diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactsProcessingItemsBuilderContext.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactsProcessingItemsBuilderContext.java index 33f599162f8c..21597e988500 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactsProcessingItemsBuilderContext.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactsProcessingItemsBuilderContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2010 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,15 +32,14 @@ import java.util.Map; * @author nik */ public class ArtifactsProcessingItemsBuilderContext implements ArtifactIncrementalCompilerContext { - private boolean myCollectingEnabledItems; - protected final Map myItemsBySource; + protected final Map myItemsBySource; private final Map mySourceByOutput; private final Map myJarByPath; private final CompileContext myCompileContext; public ArtifactsProcessingItemsBuilderContext(CompileContext compileContext) { myCompileContext = compileContext; - myItemsBySource = new HashMap(); + myItemsBySource = new HashMap(); mySourceByOutput = new HashMap(); myJarByPath = new HashMap(); } @@ -51,19 +50,14 @@ public class ArtifactsProcessingItemsBuilderContext implements ArtifactIncrement } if (checkOutputPath(destinationInfo.getOutputPath(), sourceFile)) { - getOrCreateProcessingItem(sourceFile).addDestination(destinationInfo, myCollectingEnabledItems); + getOrCreateProcessingItem(sourceFile).addDestination(destinationInfo); return true; } return false; } - public ArtifactPackagingProcessingItem[] getProcessingItems() { - final Collection processingItems = myItemsBySource.values(); - return processingItems.toArray(new ArtifactPackagingProcessingItem[processingItems.size()]); - } - - public void setCollectingEnabledItems(boolean collectingEnabledItems) { - myCollectingEnabledItems = collectingEnabledItems; + public Collection getProcessingItems() { + return myItemsBySource.values(); } public boolean checkOutputPath(final String outputPath, final VirtualFile sourceFile) { @@ -76,7 +70,7 @@ public class ArtifactsProcessingItemsBuilderContext implements ArtifactIncrement return false; } - public ArtifactPackagingProcessingItem getItemBySource(VirtualFile source) { + public ArtifactCompilerCompileItem getItemBySource(VirtualFile source) { return myItemsBySource.get(source); } @@ -102,10 +96,10 @@ public class ArtifactsProcessingItemsBuilderContext implements ArtifactIncrement return myCompileContext; } - public ArtifactPackagingProcessingItem getOrCreateProcessingItem(VirtualFile sourceFile) { - ArtifactPackagingProcessingItem item = myItemsBySource.get(sourceFile); + public ArtifactCompilerCompileItem getOrCreateProcessingItem(VirtualFile sourceFile) { + ArtifactCompilerCompileItem item = myItemsBySource.get(sourceFile); if (item == null) { - item = new ArtifactPackagingProcessingItem(sourceFile); + item = new ArtifactCompilerCompileItem(sourceFile); myItemsBySource.put(sourceFile, item); } return item; diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/CopyToDirectoryInstructionCreator.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/CopyToDirectoryInstructionCreator.java index 46862ac9dec4..12caefa285bd 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/CopyToDirectoryInstructionCreator.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/CopyToDirectoryInstructionCreator.java @@ -29,7 +29,8 @@ public class CopyToDirectoryInstructionCreator extends IncrementalCompilerInstru private final String myOutputPath; private final @Nullable VirtualFile myOutputFile; - public CopyToDirectoryInstructionCreator(ArtifactsProcessingItemsBuilderContext context, String outputPath, @Nullable VirtualFile outputFile) { + public CopyToDirectoryInstructionCreator(ArtifactsProcessingItemsBuilderContext context, String outputPath, + @Nullable VirtualFile outputFile) { super(context); myOutputPath = outputPath; myOutputFile = outputFile; diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/IncrementalArtifactsCompiler.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/IncrementalArtifactsCompiler.java deleted file mode 100644 index 9a322302d56c..000000000000 --- a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/IncrementalArtifactsCompiler.java +++ /dev/null @@ -1,583 +0,0 @@ -/* - * Copyright 2000-2009 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.packaging.impl.compiler; - -import com.intellij.compiler.CompilerManagerImpl; -import com.intellij.compiler.impl.CompilerCacheManager; -import com.intellij.compiler.impl.CompilerUtil; -import com.intellij.compiler.impl.FileProcessingCompilerStateCache; -import com.intellij.compiler.impl.packagingCompiler.*; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.application.ReadAction; -import com.intellij.openapi.application.Result; -import com.intellij.openapi.compiler.*; -import com.intellij.openapi.compiler.make.BuildParticipant; -import com.intellij.openapi.compiler.make.BuildParticipantProvider; -import com.intellij.openapi.deployment.DeploymentUtil; -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; -import com.intellij.openapi.progress.ProcessCanceledException; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Key; -import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.Ref; -import com.intellij.openapi.util.SystemInfo; -import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.JarFileSystem; -import com.intellij.openapi.vfs.LocalFileSystem; -import com.intellij.openapi.vfs.VfsUtil; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.newvfs.RefreshQueue; -import com.intellij.packaging.artifacts.Artifact; -import com.intellij.packaging.artifacts.ArtifactManager; -import com.intellij.packaging.artifacts.ArtifactProperties; -import com.intellij.packaging.artifacts.ArtifactPropertiesProvider; -import com.intellij.packaging.elements.CompositePackagingElement; -import com.intellij.packaging.elements.PackagingElementResolvingContext; -import com.intellij.packaging.impl.artifacts.ArtifactValidationUtil; -import com.intellij.testFramework.LightVirtualFile; -import com.intellij.util.ArrayUtil; -import com.intellij.util.ThrowableRunnable; -import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.text.CaseInsensitiveStringHashingStrategy; -import gnu.trove.THashSet; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.io.DataInput; -import java.io.File; -import java.io.FileFilter; -import java.io.IOException; -import java.util.*; - -/** - * @author nik - */ -public class IncrementalArtifactsCompiler implements PackagingCompiler { - private static final Logger LOG = Logger.getInstance("#com.intellij.packaging.impl.compiler.IncrementalArtifactsCompiler"); - private static final Key> WRITTEN_PATHS_KEY = Key.create("artifacts_written_paths"); - private static final Key> FILES_TO_DELETE_KEY = Key.create("artifacts_files_to_delete"); - private static final Key> AFFECTED_ARTIFACTS = Key.create("affected_artifacts"); - private static final Key BUILDER_CONTEXT_KEY = Key.create("artifacts_builder_context"); - @Nullable private PackagingCompilerCache myOutputItemsCache; - - @Nullable - public static IncrementalArtifactsCompiler getInstance(@NotNull Project project) { - final IncrementalArtifactsCompiler[] compilers = CompilerManager.getInstance(project).getCompilers(IncrementalArtifactsCompiler.class); - return compilers.length == 1 ? compilers[0] : null; - } - - private static ArtifactPackagingProcessingItem[] collectItems(ArtifactsProcessingItemsBuilderContext builderContext, final Project project) { - final CompileContext context = builderContext.getCompileContext(); - - final Set artifactsToBuild = ArtifactCompileScope.getArtifactsToBuild(project, context.getCompileScope()); - if (LOG.isDebugEnabled()) { - LOG.debug("artifacts to build: " + artifactsToBuild); - } - List additionalArtifacts = new ArrayList(); - for (BuildParticipantProvider provider : BuildParticipantProvider.EXTENSION_POINT_NAME.getExtensions()) { - for (Module module : ModuleManager.getInstance(project).getModules()) { - final Collection participants = provider.getParticipants(module); - for (BuildParticipant participant : participants) { - ContainerUtil.addIfNotNull(participant.createArtifact(context), additionalArtifacts); - } - } - } - if (LOG.isDebugEnabled() && !additionalArtifacts.isEmpty()) { - LOG.debug("additional artifacts to build: " + additionalArtifacts); - } - artifactsToBuild.addAll(additionalArtifacts); - - final List allArtifacts = new ArrayList(Arrays.asList(ArtifactManager.getInstance(project).getArtifacts())); - allArtifacts.addAll(additionalArtifacts); - for (Artifact artifact : allArtifacts) { - final String outputPath = artifact.getOutputPath(); - if (outputPath != null && outputPath.length() != 0) { - collectItems(builderContext, artifact, outputPath, project, artifactsToBuild.contains(artifact)); - } - else if (artifactsToBuild.contains(artifact)) { - context.addMessage(CompilerMessageCategory.ERROR, "Cannot build '" + artifact.getName() + "' artifact: output path is not specified", - null, -1, -1); - } - } - context.putUserData(AFFECTED_ARTIFACTS, artifactsToBuild); - return builderContext.getProcessingItems(); - } - - @NotNull - public ProcessingItem[] getProcessingItems(final CompileContext context) { - return new ReadAction() { - protected void run(final Result result) { - final Project project = context.getProject(); - final Set selfIncludingArtifacts = ArtifactValidationUtil.getInstance(project).getSelfIncludingArtifacts(); - if (!selfIncludingArtifacts.isEmpty()) { - LOG.info("Self including artifacts: " + selfIncludingArtifacts); - if (!ArtifactCompileScope.getArtifactsToBuild(project, context.getCompileScope()).isEmpty()) { - for (Artifact artifact : selfIncludingArtifacts) { - context.addMessage(CompilerMessageCategory.ERROR, "Artifact '" + artifact.getName() + "' includes itself in the output layout", null, -1, -1); - } - } - result.setResult(ProcessingItem.EMPTY_ARRAY); - return; - } - - ArtifactsProcessingItemsBuilderContext builderContext = new ArtifactsProcessingItemsBuilderContext(context); - context.putUserData(BUILDER_CONTEXT_KEY, builderContext); - ArtifactPackagingProcessingItem[] allProcessingItems = collectItems(builderContext, project); - - if (LOG.isDebugEnabled()) { - int num = Math.min(5000, allProcessingItems.length); - LOG.debug("All files (" + num + " of " + allProcessingItems.length + "):"); - for (int i = 0; i < num; i++) { - LOG.debug(allProcessingItems[i].getFile().getPath()); - } - } - - try { - final FileProcessingCompilerStateCache cache = - CompilerCacheManager.getInstance(project).getFileProcessingCompilerCache(IncrementalArtifactsCompiler.this); - for (ArtifactPackagingProcessingItem item : allProcessingItems) { - item.init(cache); - } - } - catch (IOException e) { - context.requestRebuildNextTime(e.getMessage()); - context.addMessage(CompilerMessageCategory.ERROR, e.getMessage(), null, -1, -1); - result.setResult(ProcessingItem.EMPTY_ARRAY); - LOG.info(e); - return; - } - - boolean hasFilesToDelete = collectFilesToDelete(context, builderContext.getProcessingItems()); - if (hasFilesToDelete) { - MockProcessingItem mockItem = new MockProcessingItem(new LightVirtualFile("239239293")); - result.setResult(ArrayUtil.append(allProcessingItems, mockItem, ProcessingItem.class)); - } - else { - result.setResult(allProcessingItems); - } - } - }.execute().getResultObject(); - } - - private static void collectItems(@NotNull ArtifactsProcessingItemsBuilderContext builderContext, - @NotNull Artifact artifact, - @NotNull String outputPath, - final Project project, boolean enable) { - final CompositePackagingElement rootElement = artifact.getRootElement(); - final VirtualFile outputFile = LocalFileSystem.getInstance().findFileByPath(outputPath); - final CopyToDirectoryInstructionCreator instructionCreator = - new CopyToDirectoryInstructionCreator(builderContext, outputPath, outputFile); - final PackagingElementResolvingContext resolvingContext = ArtifactManager.getInstance(project).getResolvingContext(); - builderContext.setCollectingEnabledItems(enable); - rootElement.computeIncrementalCompilerInstructions(instructionCreator, resolvingContext, builderContext, artifact.getArtifactType()); - } - - public ProcessingItem[] process(final CompileContext context, final ProcessingItem[] items) { - final Set deletedJars = deleteOutdatedFiles(context); - - final List processedItems = new ArrayList(); - final Set writtenPaths = createPathsHashSet(); - final Ref built = Ref.create(false); - CompilerUtil.runInContext(context, "Copying files", new ThrowableRunnable() { - public void run() throws RuntimeException { - built.set(doBuild(context, items, processedItems, writtenPaths, deletedJars)); - } - }); - if (!built.get()) { - return ProcessingItem.EMPTY_ARRAY; - } - - context.getProgressIndicator().setText(CompilerBundle.message("packaging.compiler.message.updating.caches")); - context.getProgressIndicator().setText2(""); - refreshOutputFiles(writtenPaths); - new ReadAction() { - protected void run(final Result result) { - processDestinations(processedItems); - } - }.execute(); - removeInvalidItems(processedItems); - updateOutputCache(context.getProject(), processedItems); - context.putUserData(WRITTEN_PATHS_KEY, writtenPaths); - return processedItems.toArray(new ProcessingItem[processedItems.size()]); - } - - private static boolean doBuild(final CompileContext context, - final ProcessingItem[] items, - final List processedItems, - final Set writtenPaths, - final Set deletedJars) { - final boolean testMode = ApplicationManager.getApplication().isUnitTestMode(); - - if (LOG.isDebugEnabled()) { - int num = Math.min(200, items.length); - LOG.debug("Files to process (" + num + " of " + items.length + "):"); - for (int i = 0; i < num; i++) { - LOG.debug(items[i].getFile().getPath()); - } - } - final DeploymentUtil deploymentUtil = DeploymentUtil.getInstance(); - final FileFilter fileFilter = new IgnoredFileFilter(); - final ArtifactsProcessingItemsBuilderContext builderContext = context.getUserData(BUILDER_CONTEXT_KEY); - final Set changedJars = new THashSet(); - for (String deletedJar : deletedJars) { - ContainerUtil.addIfNotNull(builderContext.getJarInfo(deletedJar), changedJars); - } - - try { - onBuildStartedOrFinished(builderContext, false); - if (context.getMessageCount(CompilerMessageCategory.ERROR) > 0) { - return false; - } - - int i = 0; - for (final ProcessingItem item0 : items) { - if (item0 instanceof MockProcessingItem) continue; - final ArtifactPackagingProcessingItem item = (ArtifactPackagingProcessingItem)item0; - context.getProgressIndicator().checkCanceled(); - - final Ref exception = Ref.create(null); - new ReadAction() { - protected void run(final Result result) { - final File fromFile = VfsUtil.virtualToIoFile(item.getFile()); - for (DestinationInfo destination : item.getEnabledDestinations()) { - if (destination instanceof ExplodedDestinationInfo) { - final ExplodedDestinationInfo explodedDestination = (ExplodedDestinationInfo)destination; - File toFile = new File(FileUtil.toSystemDependentName(explodedDestination.getOutputPath())); - if (fromFile.exists()) { - try { - deploymentUtil.copyFile(fromFile, toFile, context, writtenPaths, fileFilter); - } - catch (IOException e) { - exception.set(e); - return; - } - } - } - else { - changedJars.add(((JarDestinationInfo)destination).getJarInfo()); - } - } - } - }.execute(); - if (exception.get() != null) { - throw exception.get(); - } - - context.getProgressIndicator().setFraction(++i * 1.0 / items.length); - processedItems.add(item); - if (testMode) { - CompilerManagerImpl.addRecompiledPath(FileUtil.toSystemDependentName(item.getFile().getPath())); - } - } - - JarsBuilder builder = new JarsBuilder(changedJars, fileFilter, context); - final boolean processed = builder.buildJars(writtenPaths); - if (!processed) { - return false; - } - - Set recompiledSources = new HashSet(); - for (JarInfo info : builder.getJarsToBuild()) { - for (Pair pair : info.getPackedFiles()) { - recompiledSources.add(pair.getSecond()); - } - } - for (ArtifactPackagingProcessingItem processedItem : processedItems) { - recompiledSources.remove(processedItem.getFile()); - } - for (VirtualFile source : recompiledSources) { - ArtifactPackagingProcessingItem item = builderContext.getItemBySource(source); - LOG.assertTrue(item != null, source); - processedItems.add(item); - if (testMode) { - CompilerManagerImpl.addRecompiledPath(FileUtil.toSystemDependentName(item.getFile().getPath())); - } - } - - onBuildStartedOrFinished(builderContext, true); - } - catch (ProcessCanceledException e) { - throw e; - } - catch (Exception e) { - LOG.info(e); - context.addMessage(CompilerMessageCategory.ERROR, e.getLocalizedMessage(), null, -1, -1); - return false; - } - return true; - } - - public static Set getAffectedArtifacts(final CompileContext compileContext) { - return compileContext.getUserData(AFFECTED_ARTIFACTS); - } - - @Nullable - public static Set getWrittenPaths(@NotNull CompileContext context) { - return context.getUserData(WRITTEN_PATHS_KEY); - } - - @NotNull - public String getDescription() { - return "Artifacts Packaging Compiler"; - } - - @NotNull - private PackagingCompilerCache getOutputItemsCache(final Project project) { - if (myOutputItemsCache == null) { - myOutputItemsCache = new PackagingCompilerCache( - CompilerPaths.getCompilerSystemDirectory(project).getPath() + File.separator + "incremental_artifacts_timestamp.dat"); - } - return myOutputItemsCache; - } - - public void processOutdatedItem(final CompileContext context, final String url, @Nullable final ValidityState state) { - } - - private boolean collectFilesToDelete(final CompileContext context, final ArtifactPackagingProcessingItem[] allProcessingItems) { - List filesToDelete = new ArrayList(); - Set outputPaths = createPathsHashSet(); - for (ArtifactPackagingProcessingItem item : allProcessingItems) { - for (Pair destinationInfo : item.getDestinations()) { - String outputPath = getOutputPathWithJarSeparator(destinationInfo.getFirst()); - outputPaths.add(outputPath); - } - } - - final Iterator pathIterator = getOutputItemsCache(context.getProject()).getUrlsIterator(); - while (pathIterator.hasNext()) { - String path = pathIterator.next(); - if (!outputPaths.contains(path)) { - filesToDelete.add(path); - } - } - - if (LOG.isDebugEnabled()) { - LOG.debug("Files to delete (" + filesToDelete.size() + "):"); - for (String path : filesToDelete) { - LOG.debug(path); - } - } - - if (filesToDelete.isEmpty()) { - return false; - } - context.putUserData(FILES_TO_DELETE_KEY, filesToDelete); - return true; - } - - private static String getOutputPathWithJarSeparator(DestinationInfo destinationInfo) { - String outputPath = destinationInfo.getOutputFilePath(); - if (destinationInfo instanceof JarDestinationInfo) { - final String fullOutputPath = destinationInfo.getOutputPath(); - final String fileOutputPath = destinationInfo.getOutputFilePath(); - if (fullOutputPath.startsWith(fileOutputPath)) { - outputPath += JarFileSystem.JAR_SEPARATOR + DeploymentUtil.trimForwardSlashes(fullOutputPath.substring(fileOutputPath.length())); - } - } - return outputPath; - } - - private static void onBuildStartedOrFinished(ArtifactsProcessingItemsBuilderContext context, final boolean finished) throws Exception { - final CompileContext compileContext = context.getCompileContext(); - final Set artifacts = getAffectedArtifacts(compileContext); - for (Artifact artifact : artifacts) { - for (ArtifactPropertiesProvider provider : artifact.getPropertiesProviders()) { - final ArtifactProperties properties = artifact.getProperties(provider); - if (finished) { - properties.onBuildFinished(artifact, compileContext); - } - else { - properties.onBuildStarted(artifact, compileContext); - } - } - } - } - - private static THashSet createPathsHashSet() { - return SystemInfo.isFileSystemCaseSensitive - ? new THashSet() - : new THashSet(CaseInsensitiveStringHashingStrategy.INSTANCE); - } - - private static void removeInvalidItems(List processedItems) { - Set files = new THashSet(processedItems.size()); - for (ArtifactPackagingProcessingItem item : processedItems) { - files.add(item.getFile()); - } - RefreshQueue.getInstance().refresh(false, false, null, VfsUtil.toVirtualFileArray(files)); - - final Iterator iterator = processedItems.iterator(); - while (iterator.hasNext()) { - ArtifactPackagingProcessingItem item = iterator.next(); - final VirtualFile file = item.getFile(); - if (!file.isValid()) { - iterator.remove(); - } - } - } - - private static void processDestinations(final List items) { - for (ArtifactPackagingProcessingItem item : items) { - item.setProcessed(); - } - } - - private Set deleteOutdatedFiles(final CompileContext context) { - context.getProgressIndicator().setText(CompilerBundle.message("packaging.compiler.message.deleting.outdated.files")); - final List filesToDelete = context.getUserData(FILES_TO_DELETE_KEY); - final Set deletedJars; - if (filesToDelete != null) { - deletedJars = deleteFiles(filesToDelete, context); - } - else { - deletedJars = Collections.emptySet(); - } - context.getProgressIndicator().checkCanceled(); - return deletedJars; - } - - private Set deleteFiles(final List paths, CompileContext context) { - final Set artifactsToBuild = getAffectedArtifacts(context); - - final boolean testMode = ApplicationManager.getApplication().isUnitTestMode(); - final THashSet deletedJars = new THashSet(); - final THashSet notDeletedJars = new THashSet(); - if (LOG.isDebugEnabled()) { - LOG.debug("Deleting outdated files..."); - } - - int notDeletedFilesCount = 0; - final Artifact[] allArtifacts = ArtifactManager.getInstance(context.getProject()).getArtifacts(); - List filesToRefresh = new ArrayList(); - for (String fullPath : paths) { - boolean isUnderOutput = false; - boolean isInArtifactsToBuild = false; - for (Artifact artifact : allArtifacts) { - final String path = artifact.getOutputPath(); - if (!StringUtil.isEmpty(path) && FileUtil.startsWith(fullPath, path)) { - isUnderOutput = true; - if (artifactsToBuild.contains(artifact)) { - isInArtifactsToBuild = true; - break; - } - } - } - if (isUnderOutput && !isInArtifactsToBuild) continue; - - int end = fullPath.indexOf(JarFileSystem.JAR_SEPARATOR); - boolean isJar = end != -1; - String filePath = isJar ? fullPath.substring(0, end) : fullPath; - boolean deleted = false; - if (isJar) { - if (notDeletedJars.contains(filePath)) { - continue; - } - deleted = deletedJars.contains(filePath); - } - - File file = new File(FileUtil.toSystemDependentName(filePath)); - if (!deleted) { - filesToRefresh.add(file); - deleted = FileUtil.delete(file); - } - - if (deleted) { - if (isJar) { - deletedJars.add(filePath); - } - if (testMode) { - CompilerManagerImpl.addDeletedPath(file.getAbsolutePath()); - } - getOutputItemsCache(context.getProject()).remove(fullPath); - } - else { - if (isJar) { - notDeletedJars.add(filePath); - } - if (notDeletedFilesCount++ > 50) { - context.addMessage(CompilerMessageCategory.WARNING, "Deletion of outdated files stopped because too many files cannot be deleted", null, -1, -1); - break; - } - context.addMessage(CompilerMessageCategory.WARNING, "Cannot delete file '" + filePath + "'", null, -1, -1); - if (LOG.isDebugEnabled()) { - LOG.debug("Cannot delete file " + file); - } - } - } - - CompilerUtil.refreshIOFiles(filesToRefresh); - return deletedJars; - } - - private void updateOutputCache(final Project project, final List processedItems) { - for (ArtifactPackagingProcessingItem processedItem : processedItems) { - for (DestinationInfo destinationInfo : processedItem.getEnabledDestinations()) { - final VirtualFile virtualFile = destinationInfo.getOutputFile(); - if (virtualFile != null) { - final String path = getOutputPathWithJarSeparator(destinationInfo); - if (LOG.isDebugEnabled()) { - LOG.debug("update output cache: file " + path); - } - getOutputItemsCache(project).update(path, virtualFile.getTimeStamp()); - } - } - } - saveCacheIfDirty(project); - } - - private static void refreshOutputFiles(Set writtenPaths) { - final ArrayList filesToRefresh = new ArrayList(); - for (String path : writtenPaths) { - filesToRefresh.add(new File(path)); - } - CompilerUtil.refreshIOFiles(filesToRefresh); - } - - private void saveCacheIfDirty(final Project project) { - if (getOutputItemsCache(project).isDirty()) { - getOutputItemsCache(project).save(); - } - } - - public ValidityState createValidityState(final DataInput is) throws IOException { - return new ArtifactPackagingItemValidityState(is); - } - - public boolean validateConfiguration(final CompileScope scope) { - return true; - } - - private static class MockProcessingItem implements ProcessingItem { - private final VirtualFile myFile; - - public MockProcessingItem(final VirtualFile file) { - myFile = file; - } - - @NotNull - public VirtualFile getFile() { - return myFile; - } - - @Nullable - public ValidityState getValidityState() { - return null; - } - } -} diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/PackIntoArchiveInstructionCreator.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/PackIntoArchiveInstructionCreator.java index a703503175b2..cfeb4b1646d9 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/PackIntoArchiveInstructionCreator.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/PackIntoArchiveInstructionCreator.java @@ -30,8 +30,8 @@ public class PackIntoArchiveInstructionCreator extends IncrementalCompilerInstru private final JarInfo myJarInfo; private final String myPathInJar; - public PackIntoArchiveInstructionCreator(ArtifactsProcessingItemsBuilderContext context, JarInfo jarInfo, String pathInJar, - DestinationInfo jarDestination) { + public PackIntoArchiveInstructionCreator(ArtifactsProcessingItemsBuilderContext context, JarInfo jarInfo, + String pathInJar, DestinationInfo jarDestination) { super(context); myJarInfo = jarInfo; myPathInJar = pathInJar; @@ -55,7 +55,8 @@ public class PackIntoArchiveInstructionCreator extends IncrementalCompilerInstru public IncrementalCompilerInstructionCreator archive(@NotNull String archiveFileName) { final JarInfo jarInfo = new JarInfo(); - if (!myContext.registerJarFile(jarInfo, myJarDestination.getOutputPath() + "/" + archiveFileName)) { + final String outputPath = myJarDestination.getOutputPath() + "/" + archiveFileName; + if (!myContext.registerJarFile(jarInfo, outputPath)) { return new SkipAllInstructionCreator(myContext); } final JarDestinationInfo destination = new JarDestinationInfo(childPathInJar(archiveFileName), myJarInfo, myJarDestination); diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRunTaskProvider.java b/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRunTaskProvider.java index 3d18372af496..3b0e586020f2 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRunTaskProvider.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRunTaskProvider.java @@ -35,7 +35,7 @@ import com.intellij.openapi.util.Ref; import com.intellij.packaging.artifacts.*; import com.intellij.packaging.impl.compiler.ArtifactAwareCompiler; import com.intellij.packaging.impl.compiler.ArtifactCompileScope; -import com.intellij.packaging.impl.compiler.IncrementalArtifactsCompiler; +import com.intellij.packaging.impl.compiler.ArtifactsCompiler; import com.intellij.util.concurrency.Semaphore; import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashSet; @@ -148,7 +148,7 @@ public class BuildArtifactsBeforeRunTaskProvider extends BeforeRunTaskProvider + From f08e3105c0110040590d1b9cdc3c019b1297d4af Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Tue, 27 Jul 2010 22:27:07 +0400 Subject: [PATCH 35/82] IDEA-54306: Preference "when empty changelist becomes inactive" is not persisted --- .../com/intellij/openapi/vcs/VcsConfiguration.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/VcsConfiguration.java b/platform/vcs-api/src/com/intellij/openapi/vcs/VcsConfiguration.java index 59dc044c95c5..5b9fe2914bc0 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/VcsConfiguration.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/VcsConfiguration.java @@ -51,6 +51,7 @@ public final class VcsConfiguration implements PersistentStateComponent @NonNls private static final String VALUE_ATTR = "value"; @NonNls private static final String CONFIRM_MOVE_TO_FAILED_COMMIT_ELEMENT = "confirmMoveToFailedCommit"; + @NonNls private static final String CONFIRM_REMOVE_EMPTY_CHANGELIST_ELEMENT = "confirmRemoveEmptyChangelist"; private Project myProject; public boolean OFFER_MOVE_TO_ANOTHER_CHANGELIST_ON_PARTIAL_COMMIT = true; @@ -164,10 +165,14 @@ public final class VcsConfiguration implements PersistentStateComponent public void readExternal(Element element) throws InvalidDataException { DefaultJDOMExternalizer.readExternal(this, element); - final Element child = element.getChild(CONFIRM_MOVE_TO_FAILED_COMMIT_ELEMENT); + Element child = element.getChild(CONFIRM_MOVE_TO_FAILED_COMMIT_ELEMENT); if (child != null) { MOVE_TO_FAILED_COMMIT_CHANGELIST = VcsShowConfirmationOption.Value.fromString(child.getAttributeValue(VALUE_ATTR)); } + child = element.getChild(CONFIRM_REMOVE_EMPTY_CHANGELIST_ELEMENT); + if (child != null) { + REMOVE_EMPTY_INACTIVE_CHANGELISTS = VcsShowConfirmationOption.Value.fromString(child.getAttributeValue(VALUE_ATTR)); + } final List messages = element.getChildren(MESSAGE_ELEMENT_NAME); for (final Object message : messages) { saveCommitMessage(((Element)message).getAttributeValue(VALUE_ATTR)); @@ -188,6 +193,11 @@ public final class VcsConfiguration implements PersistentStateComponent confirmChild.setAttribute(VALUE_ATTR, MOVE_TO_FAILED_COMMIT_CHANGELIST.toString()); element.addContent(confirmChild); } + if (REMOVE_EMPTY_INACTIVE_CHANGELISTS != VcsShowConfirmationOption.Value.SHOW_CONFIRMATION) { + Element confirmChild = new Element(CONFIRM_REMOVE_EMPTY_CHANGELIST_ELEMENT); + confirmChild.setAttribute(VALUE_ATTR, REMOVE_EMPTY_INACTIVE_CHANGELISTS.toString()); + element.addContent(confirmChild); + } for (String message : myLastCommitMessages) { final Element messageElement = new Element(MESSAGE_ELEMENT_NAME); messageElement.setAttribute(VALUE_ATTR, message); From 4e4f62ea3bafddda14d283337bbc05f62fb755c0 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Wed, 28 Jul 2010 13:59:42 +0400 Subject: [PATCH 36/82] deferred icon loading -- registry key --- platform/lang-api/src/com/intellij/psi/impl/ElementBase.java | 3 ++- platform/platform-resources-en/src/misc/registry.properties | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/platform/lang-api/src/com/intellij/psi/impl/ElementBase.java b/platform/lang-api/src/com/intellij/psi/impl/ElementBase.java index e6b780129a25..d995c805c8b3 100644 --- a/platform/lang-api/src/com/intellij/psi/impl/ElementBase.java +++ b/platform/lang-api/src/com/intellij/psi/impl/ElementBase.java @@ -21,6 +21,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.Iconable; import com.intellij.openapi.util.UserDataHolderBase; +import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.IndexNotReadyException; @@ -95,7 +96,7 @@ public abstract class ElementBase extends UserDataHolderBase implements Iconable } protected boolean isToDeferIconLoading() { - return true; + return Registry.is("psi.deferIconLoading"); } private Icon computeIconNow(PsiElement element, int flags) { diff --git a/platform/platform-resources-en/src/misc/registry.properties b/platform/platform-resources-en/src/misc/registry.properties index 7671ea69a6c3..ca1ebbe79aa2 100644 --- a/platform/platform-resources-en/src/misc/registry.properties +++ b/platform/platform-resources-en/src/misc/registry.properties @@ -77,7 +77,10 @@ compiler.perform.outputs.refresh.on.start.description=Whether to perform initial compiler.perform.outputs.refresh.on.start.restartRequired=false vcs.show.colored.annotations=true vcs.showConsole=true + psi.viewer.selection.color=0,153,153 +psi.deferIconLoading=true structureView.coalesceTime=500 jar.build=false + From e08182c4d9a8d1dc376972954e3a620912e4c700 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Wed, 28 Jul 2010 14:03:50 +0400 Subject: [PATCH 37/82] debugger session tab make app icon bounce if set up no to focus project window --- .../intellij/xdebugger/impl/ui/DebuggerSessionTabBase.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerSessionTabBase.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerSessionTabBase.java index cec01dc8bf82..7100705fd3d6 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerSessionTabBase.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerSessionTabBase.java @@ -35,6 +35,7 @@ import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.registry.Registry; +import com.intellij.ui.AppIcon; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentManagerAdapter; import com.intellij.ui.content.ContentManagerEvent; @@ -202,7 +203,11 @@ public abstract class DebuggerSessionTabBase implements DebuggerLogConsoleManage ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { - ProjectUtil.focusProjectWindow(getProject(), Registry.is("debugger.mayBringFrameToFrontOnBreakpoint")); + boolean focusWnd = Registry.is("debugger.mayBringFrameToFrontOnBreakpoint"); + ProjectUtil.focusProjectWindow(getProject(), focusWnd); + if (!focusWnd) { + AppIcon.getInstance().requestAttention(true); + } } }); } From a8e5ad91c7599028dc9977e02bbc750a47b09f41 Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Tue, 27 Jul 2010 14:44:16 +0400 Subject: [PATCH 38/82] vfs zip exceptions fixed --- .../history/core/ChangeListStorageImpl.java | 2 +- .../util/io/storage/AbstractStorage.java | 84 +++++++++---------- .../util/io/storage/RefCountingStorage.java | 50 ++++++----- 3 files changed, 72 insertions(+), 64 deletions(-) diff --git a/platform/lvcs-impl/src/com/intellij/history/core/ChangeListStorageImpl.java b/platform/lvcs-impl/src/com/intellij/history/core/ChangeListStorageImpl.java index 10de5a3fd2a4..ec49a27bbd64 100644 --- a/platform/lvcs-impl/src/com/intellij/history/core/ChangeListStorageImpl.java +++ b/platform/lvcs-impl/src/com/intellij/history/core/ChangeListStorageImpl.java @@ -102,8 +102,8 @@ public class ChangeListStorageImpl implements ChangeListStorage { } private ChangeSetBlock doReadBlock(int id) { - DataInputStream in = myStorage.readStream(id); try { + DataInputStream in = myStorage.readStream(id); try { int size = in.readInt(); List changes = new ArrayList(size); diff --git a/platform/util/src/com/intellij/util/io/storage/AbstractStorage.java b/platform/util/src/com/intellij/util/io/storage/AbstractStorage.java index 7192537ef2cc..cd47b1a0c146 100644 --- a/platform/util/src/com/intellij/util/io/storage/AbstractStorage.java +++ b/platform/util/src/com/intellij/util/io/storage/AbstractStorage.java @@ -200,7 +200,47 @@ public abstract class AbstractStorage implements Disposable, Forceable { } } - private void appendBytes(int record, byte[] bytes) { + private static int calcCapacity(int requiredLength) { + return Math.max(64, nearestPowerOfTwo(requiredLength * 3 / 2)); + } + + private static int nearestPowerOfTwo(int n) { + int power = 1; + while (n != 0) { + power *= 2; + n /= 2; + } + return power; + } + + public StorageDataOutput writeStream(final int record) { + return new StorageDataOutput(this, record); + } + + public AppenderStream appendStream(int record) { + return new AppenderStream(record); + } + + public DataInputStream readStream(int record) throws IOException { + final byte[] bytes = readBytes(record); + return new DataInputStream(new ByteArrayInputStream(bytes)); + } + + protected byte[] readBytes(int record) throws IOException { + synchronized (myLock) { + final int length = myRecordsTable.getSize(record); + if (length == 0) return ArrayUtil.EMPTY_BYTE_ARRAY; + assert length > 0; + + final long address = myRecordsTable.getAddress(record); + byte[] result = new byte[length]; + myDataTable.readBytes(address, result); + + return result; + } + } + + protected void appendBytes(int record, byte[] bytes) throws IOException { int delta = bytes.length; if (delta == 0) return; @@ -227,7 +267,7 @@ public abstract class AbstractStorage implements Disposable, Forceable { } } - public void writeBytes(int record, byte[] bytes) { + protected void writeBytes(int record, byte[] bytes) throws IOException { synchronized (myLock) { final int requiredLength = bytes.length; final int currentCapacity = myRecordsTable.getCapacity(record); @@ -257,46 +297,6 @@ public abstract class AbstractStorage implements Disposable, Forceable { } } - private static int calcCapacity(int requiredLength) { - return Math.max(64, nearestPowerOfTwo(requiredLength * 3 / 2)); - } - - private static int nearestPowerOfTwo(int n) { - int power = 1; - while (n != 0) { - power *= 2; - n /= 2; - } - return power; - } - - public StorageDataOutput writeStream(final int record) { - return new StorageDataOutput(this, record); - } - - public AppenderStream appendStream(int record) { - return new AppenderStream(record); - } - - public DataInputStream readStream(int record) { - final byte[] bytes = readBytes(record); - return new DataInputStream(new ByteArrayInputStream(bytes)); - } - - byte[] readBytes(int record) { - synchronized (myLock) { - final int length = myRecordsTable.getSize(record); - if (length == 0) return ArrayUtil.EMPTY_BYTE_ARRAY; - assert length > 0; - - final long address = myRecordsTable.getAddress(record); - byte[] result = new byte[length]; - myDataTable.readBytes(address, result); - - return result; - } - } - protected void doDeleteRecord(int record) throws IOException { myDataTable.reclaimSpace(myRecordsTable.getSize(record)); myRecordsTable.deleteRecord(record); diff --git a/platform/util/src/com/intellij/util/io/storage/RefCountingStorage.java b/platform/util/src/com/intellij/util/io/storage/RefCountingStorage.java index 8851d17f8130..68fd54cb9e50 100644 --- a/platform/util/src/com/intellij/util/io/storage/RefCountingStorage.java +++ b/platform/util/src/com/intellij/util/io/storage/RefCountingStorage.java @@ -19,10 +19,14 @@ */ package com.intellij.util.io.storage; +import com.intellij.openapi.util.io.StreamUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.io.PagePool; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; import java.util.zip.DeflaterOutputStream; import java.util.zip.InflaterInputStream; @@ -31,32 +35,36 @@ public class RefCountingStorage extends AbstractStorage { super(path); } - public RefCountingStorage(String path, PagePool pool) throws IOException { - super(path, pool); + @Override + protected byte[] readBytes(int record) throws IOException { + byte[] result = super.readBytes(record); + InflaterInputStream in = new InflaterInputStream(new ByteArrayInputStream(result)); + try { + return StreamUtil.loadFromStream(in); + } + finally { + in.close(); + } } @Override - public StorageDataOutput writeStream(int record) { - final ByteArrayOutputStream stream = new ByteArrayOutputStream(); - return new StorageDataOutput(this, record, new DeflaterOutputStream(stream)) { - @Override - protected ByteArrayOutputStream getByteStream() { - return stream; - } - }; - } - - @Override - public DataInputStream readStream(int record) { - final byte[] bytes = readBytes(record); - return new DataInputStream(new InflaterInputStream(new ByteArrayInputStream(bytes))); - } - - @Override - public AppenderStream appendStream(int record) { + protected void appendBytes(int record, byte[] bytes) throws IOException { throw new IncorrectOperationException("Appending is not supported"); } + @Override + protected void writeBytes(int record, byte[] bytes) throws IOException { + ByteArrayOutputStream s = new ByteArrayOutputStream(); + DeflaterOutputStream out = new DeflaterOutputStream(s); + try { + out.write(bytes); + } + finally { + out.close(); + } + super.writeBytes(record, s.toByteArray()); + } + @Override protected AbstractRecordsTable createRecordsTable(PagePool pool, File recordsFile) throws IOException { return new RefCountingRecordsTable(recordsFile, pool); From ab39c94d8e8525cdaea67966620544e27018ae6d Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Wed, 28 Jul 2010 14:03:36 +0400 Subject: [PATCH 39/82] Maven: npe in psi property resolver --- .../idea/maven/dom/references/MavenPropertyPsiReference.java | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReference.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReference.java index a8932a636b07..8f53098da26b 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReference.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReference.java @@ -182,6 +182,7 @@ public class MavenPropertyPsiReference extends MavenPsiReference { result = new MavenDomProjectProcessorUtils.DomParentProjectFileProcessor(myProjectsManager) { protected PsiElement doProcessParent(VirtualFile parentFile) { MavenDomProjectModel parentProjectDom = MavenDomUtil.getMavenDomProjectModel(myProject, parentFile); + if (parentProjectDom == null) return null; return resolveModelProperty(parentProjectDom, path, recursionGuard); } }.process(projectDom); From 3958cf9b27be49e10097be8e5013ae83ace10b45 Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Wed, 28 Jul 2010 15:31:09 +0400 Subject: [PATCH 40/82] Maven: logging --- .../org/jetbrains/idea/maven/project/MavenProjectsManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java index 6612d595c6cc..8c87b9318323 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java @@ -224,7 +224,7 @@ public class MavenProjectsManager extends SimpleProjectComponent myProjectsTree.save(getProjectsTreeFile()); } catch (IOException e) { - MavenLog.LOG.error(e); + MavenLog.LOG.warn(e); } } } From 642950b5110a120202d49b6b2e135d8e8fee7078 Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Wed, 28 Jul 2010 15:35:15 +0400 Subject: [PATCH 41/82] Maven: invalid file access fix --- .../jetbrains/idea/maven/wizards/MavenModuleBuilderHelper.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilderHelper.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilderHelper.java index 4493fb80522b..f965aa5cf0bc 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilderHelper.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilderHelper.java @@ -125,6 +125,8 @@ public class MavenModuleBuilderHelper { // execute when current dialog is closed (e.g. Project Structure) MavenUtil.invokeLater(project, ModalityState.NON_MODAL, new Runnable() { public void run() { + if (!pom.isValid()) return; + EditorHelper.openInEditor(getPsiFile(project, pom)); if (myArchetype != null) generateFromArchetype(project, pom); } From 67ec9973efe53760d1a60c63539ef2a36a699823 Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Wed, 28 Jul 2010 16:51:15 +0400 Subject: [PATCH 42/82] scroll pane: npe fix --- .../intellij/ui/components/JBScrollPane.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ui/components/JBScrollPane.java b/platform/platform-api/src/com/intellij/ui/components/JBScrollPane.java index 10dbfd4fed5d..e5e24128b218 100644 --- a/platform/platform-api/src/com/intellij/ui/components/JBScrollPane.java +++ b/platform/platform-api/src/com/intellij/ui/components/JBScrollPane.java @@ -58,16 +58,19 @@ public class JBScrollPane extends JScrollPane { @Override public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { JViewport vp = getViewport(); - if (vp != null) { - Color bg = vp.getView().getBackground(); - if (bg != null) { - g.setColor(bg); - g.drawLine(0, 0, width - 1, 0); - g.drawLine(0, height - 1, width - 1, height - 1); - g.drawLine(0, 0, 0, height - 1); - g.drawLine(width - 1, 0, width - 1, height - 1); - } - } + if (vp == null) return; + + Component view = vp.getView(); + if (view == null) return; + + Color bg = view.getBackground(); + if (bg == null) return; + + g.setColor(bg); + g.drawLine(0, 0, width - 1, 0); + g.drawLine(0, height - 1, width - 1, height - 1); + g.drawLine(0, 0, 0, height - 1); + g.drawLine(width - 1, 0, width - 1, height - 1); } @Override From e66b430cd7b5357acc1b2af7e778e7c479225b51 Mon Sep 17 00:00:00 2001 From: Oleg Shpynov Date: Wed, 28 Jul 2010 16:01:12 +0400 Subject: [PATCH 43/82] refactoring --- .../controlflow/ControlFlowUtil.java | 39 +++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/controlflow/ControlFlowUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/controlflow/ControlFlowUtil.java index 7da42a52b808..1d05cdb39d80 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/controlflow/ControlFlowUtil.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/controlflow/ControlFlowUtil.java @@ -21,6 +21,7 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.Consumer; import com.intellij.util.Function; import com.intellij.util.Processor; +import org.jetbrains.annotations.NotNull; import java.util.Arrays; @@ -28,16 +29,16 @@ import java.util.Arrays; * @author oleg */ public class ControlFlowUtil { - private static final Logger LOG = Logger.getInstance(ControlFlowUtil.class.getName()); + private static final Logger LOG = Logger.getInstance(ControlFlowUtil.class.getName()); private ControlFlowUtil() { } public static class Stack { + private final int myCapacity; private final int[] myValues; private int myIndex; - public Stack(final int capacity) { myCapacity = capacity; myValues = new int[myCapacity]; @@ -65,8 +66,8 @@ public class ControlFlowUtil { public String toString() { return "Stack(" + (myIndex + 1) + ") elements"; } - } + } public static int[] postOrder(Instruction[] flow) { final int length = flow.length; int[] result = new int[length]; @@ -108,6 +109,7 @@ public class ControlFlowUtil { } // Process control flow in depth first order + public static boolean process(final Instruction[] flow, final int start, final Processor processor){ final int length = flow.length; boolean[] visited = new boolean[length]; @@ -135,4 +137,35 @@ public class ControlFlowUtil { } return true; } + + + public static void iteratePrev(final int startInstruction, + @NotNull final Instruction[] instructions, + @NotNull final Function closure) { + final Stack stack = new Stack(instructions.length); + final boolean[] visited = new boolean[instructions.length]; + + stack.push(startInstruction); + while (!stack.isEmpty()) { + final int num = stack.pop(); + if (visited[num]){ + continue; + } + visited[num] = true; + final Instruction instr = instructions[num]; + final Operation nextOperation = closure.fun(instr); + if (nextOperation == Operation.CONTINUE) { + continue; + } else if (nextOperation == Operation.BREAK) { + break; + } + for (Instruction pred : instr.allPred()) { + stack.push(pred.num()); + } + } + } + + public static enum Operation { + CONTINUE, BREAK, NEXT; + } } \ No newline at end of file From 18d929efe5a1066d9663bcd8f99e15195a2df04c Mon Sep 17 00:00:00 2001 From: Oleg Shpynov Date: Wed, 28 Jul 2010 16:20:54 +0400 Subject: [PATCH 44/82] RUBY-6429 SASS: don't consider indentation in the commented lines while checking indentation --- .../IndentationAnnotatorVisitor.java | 77 ++++++++++--------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/indentation/IndentationAnnotatorVisitor.java b/platform/lang-impl/src/com/intellij/indentation/IndentationAnnotatorVisitor.java index 937198ab81e8..facb47a68a3a 100644 --- a/platform/lang-impl/src/com/intellij/indentation/IndentationAnnotatorVisitor.java +++ b/platform/lang-impl/src/com/intellij/indentation/IndentationAnnotatorVisitor.java @@ -5,6 +5,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.PsiFile; import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; @@ -15,13 +16,16 @@ public class IndentationAnnotatorVisitor extends PsiElementVisitor { protected final AnnotationHolder myHolder; private final IElementType myIndentTokenType; private final IElementType myEolTokenType; + private final TokenSet myCommentTypes; public IndentationAnnotatorVisitor(@NotNull final AnnotationHolder holder, final IElementType indentTokenType, - final IElementType eolTokenType) { + final IElementType eolTokenType, + final TokenSet commentTypes) { myHolder = holder; myIndentTokenType = indentTokenType; myEolTokenType = eolTokenType; + myCommentTypes = commentTypes; } @SuppressWarnings({"ConstantConditions"}) @@ -45,43 +49,46 @@ public class IndentationAnnotatorVisitor extends PsiElementVisitor { // Iterating over leafs while (leaf != null) { final IElementType leafType = leaf.getNode().getElementType(); - if (leafType == myIndentTokenType && nextLeaf!=null && nextLeaf.getNode().getElementType() != myEolTokenType){ - final String currentIndentText = leaf.getText(); - final IndentInfo currentIndent = getIndent(currentIndentText); - final int currentIndentLength = currentIndent.length; - // Check if spaces and tabs are mixed - if (currentIndentLength == -1){ - myHolder.createErrorAnnotation(leaf, "Indentation can't use both tabs and spaces"); - } - else - if (currentIndentLength > 0) { - // If we don't have indent info registered - if (indentInfo == null){ - indentInfo = currentIndent; - lastIndent = currentIndentLength; - } else { - final Boolean useTab = indentInfo.useTab; - final int indentInfoLength = indentInfo.length; - // If indent and current indent use different space and tabs - if (useTab && currentIndentText.contains(" ") || !useTab && currentIndentText.contains("\t")) { - final String message = useTab - ? "Inconsistent indentation: " + currentIndentLength + - " spaces were used for indentation, but the rest of the document was indented using " + - indentInfoLength + " tabs" - : "Inconsistent indentation: " + currentIndentLength + - " tabs were used for indentation, but the rest of the document was indented using " + - indentInfoLength + " spaces"; - myHolder.createErrorAnnotation(leaf, message); + if (leafType == myIndentTokenType && nextLeaf != null) { + final IElementType nextLeafType = nextLeaf.getNode().getElementType(); + if (nextLeafType != myEolTokenType && !myCommentTypes.contains(nextLeafType)){ + final String currentIndentText = leaf.getText(); + final IndentInfo currentIndent = getIndent(currentIndentText); + final int currentIndentLength = currentIndent.length; + // Check if spaces and tabs are mixed + if (currentIndentLength == -1){ + myHolder.createErrorAnnotation(leaf, "Indentation can't use both tabs and spaces"); + } + else + if (currentIndentLength > 0) { + // If we don't have indent info registered + if (indentInfo == null){ + indentInfo = currentIndent; + lastIndent = currentIndentLength; } else { - // Check indent length - final int delta = currentIndentLength - lastIndent; - if (currentIndentLength % indentInfoLength != 0 || delta > indentInfoLength) { - final String message = useTab - ? currentIndentLength + " tabs were used for indentation. Must be indented using " + indentInfoLength + " tabs" - : currentIndentLength + " spaces were used for indentation. Must be indented using " + indentInfoLength + " spaces"; + final Boolean useTab = indentInfo.useTab; + final int indentInfoLength = indentInfo.length; + // If indent and current indent use different space and tabs + if (useTab && currentIndentText.contains(" ") || !useTab && currentIndentText.contains("\t")) { + final String message = useTab + ? "Inconsistent indentation: " + currentIndentLength + + " spaces were used for indentation, but the rest of the document was indented using " + + indentInfoLength + " tabs" + : "Inconsistent indentation: " + currentIndentLength + + " tabs were used for indentation, but the rest of the document was indented using " + + indentInfoLength + " spaces"; myHolder.createErrorAnnotation(leaf, message); + } else { + // Check indent length + final int delta = currentIndentLength - lastIndent; + if (currentIndentLength % indentInfoLength != 0 || delta > indentInfoLength) { + final String message = useTab + ? currentIndentLength + " tabs were used for indentation. Must be indented using " + indentInfoLength + " tabs" + : currentIndentLength + " spaces were used for indentation. Must be indented using " + indentInfoLength + " spaces"; + myHolder.createErrorAnnotation(leaf, message); + } + lastIndent = currentIndentLength / indentInfoLength * indentInfoLength; } - lastIndent = currentIndentLength / indentInfoLength * indentInfoLength; } } } From 3adddf62b82ebeea028712eda64b918ab4b4db1f Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 28 Jul 2010 18:42:58 +0400 Subject: [PATCH 45/82] same directory proximity weigher for use in non-IDEA IDEs --- .../util/proximity/SameDirectoryWeigher.java | 48 +++++++++++++++++++ .../src/META-INF/PlatformLangPlugin.xml | 2 + 2 files changed, 50 insertions(+) create mode 100644 platform/lang-impl/src/com/intellij/psi/util/proximity/SameDirectoryWeigher.java diff --git a/platform/lang-impl/src/com/intellij/psi/util/proximity/SameDirectoryWeigher.java b/platform/lang-impl/src/com/intellij/psi/util/proximity/SameDirectoryWeigher.java new file mode 100644 index 000000000000..13df01e65c5a --- /dev/null +++ b/platform/lang-impl/src/com/intellij/psi/util/proximity/SameDirectoryWeigher.java @@ -0,0 +1,48 @@ +/* + * Copyright 2000-2010 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.psi.util.proximity; + +import com.intellij.openapi.util.NullableLazyKey; +import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.ProximityLocation; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.NullableFunction; +import org.jetbrains.annotations.NotNull; + +/** + * NOTE: This class is only registered in platform-based IDEs. In IDEA, SamePackageWeigher is used instead. + * + * @author yole + */ +public class SameDirectoryWeigher extends ProximityWeigher { + private static final NullableLazyKey + PLACE_DIRECTORY = NullableLazyKey.create("placeDirectory", new NullableFunction() { + @Override + public PsiDirectory fun(ProximityLocation location) { + return PsiTreeUtil.getParentOfType(location.getPosition(), PsiDirectory.class, false); + } + }); + + public Comparable weigh(@NotNull final PsiElement element, final ProximityLocation location) { + final PsiDirectory placeDirectory = PLACE_DIRECTORY.getValue(location); + if (placeDirectory == null) { + return false; + } + + return placeDirectory.equals(PsiTreeUtil.getParentOfType(element, PsiDirectory.class, false)); + } +} diff --git a/platform/platform-resources/src/META-INF/PlatformLangPlugin.xml b/platform/platform-resources/src/META-INF/PlatformLangPlugin.xml index f8d8e74278dc..ec1066d133c7 100644 --- a/platform/platform-resources/src/META-INF/PlatformLangPlugin.xml +++ b/platform/platform-resources/src/META-INF/PlatformLangPlugin.xml @@ -80,6 +80,8 @@ + From 0947ba5f5b847dedf7c0f0236d01665c9c312759 Mon Sep 17 00:00:00 2001 From: Alexey Pegov Date: Wed, 28 Jul 2010 20:07:28 +0400 Subject: [PATCH 46/82] obj-c quick doc --- .../documentation/DocumentationComponent.java | 12 +++-- .../documentation/DocumentationManager.java | 48 +++++++++++-------- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java index af28c5a55eeb..6233d8a2872f 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java @@ -22,6 +22,7 @@ import com.intellij.codeInsight.hint.HintManagerImpl; import com.intellij.codeInsight.hint.HintUtil; import com.intellij.ide.actions.ExternalJavaDocAction; import com.intellij.lang.documentation.DocumentationProvider; +import com.intellij.lang.documentation.ExternalDocumentationHandler; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.ui.popup.JBPopup; @@ -405,10 +406,13 @@ public class DocumentationComponent extends JPanel implements Disposable { if (myElement != null) { final PsiElement element = myElement.getElement(); final DocumentationProvider provider = DocumentationManager.getProviderFromElement(element); - final List urls = provider.getUrlFor(element, DocumentationManager.getOriginalElement(element)); - assert urls != null; - assert !urls.isEmpty(); - ExternalJavaDocAction.showExternalJavadoc(urls); + final PsiElement originalElement = DocumentationManager.getOriginalElement(element); + if (!(provider instanceof ExternalDocumentationHandler) || !((ExternalDocumentationHandler)provider).handleExternal(element, originalElement)) { + final List urls = provider.getUrlFor(element, originalElement); + assert urls != null; + assert !urls.isEmpty(); + ExternalJavaDocAction.showExternalJavadoc(urls); + } } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java index 0f6dcfa19449..0a5dabb5223e 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java @@ -33,6 +33,7 @@ import com.intellij.lang.Language; import com.intellij.lang.LanguageDocumentation; import com.intellij.lang.documentation.CompositeDocumentationProvider; import com.intellij.lang.documentation.DocumentationProvider; +import com.intellij.lang.documentation.ExternalDocumentationHandler; import com.intellij.lang.documentation.ExternalDocumentationProvider; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.ActionManagerEx; @@ -816,38 +817,43 @@ public class DocumentationManager { } } else { + final DocumentationProvider provider = getProviderFromElement(psiElement); + if (!(provider instanceof ExternalDocumentationHandler) || + !((ExternalDocumentationHandler)provider).handleExternalLink(manager, url, psiElement)) { final String docUrl = url; - fetchDocInfo - (new DocumentationCollector() { - public String getDocumentation() throws Exception { - if (docUrl.startsWith(DOC_ELEMENT_PROTOCOL)) { - final List urls = ApplicationManager.getApplication().runReadAction( + fetchDocInfo + (new DocumentationCollector() { + public String getDocumentation() throws Exception { + if (docUrl.startsWith(DOC_ELEMENT_PROTOCOL)) { + final List urls = ApplicationManager.getApplication().runReadAction( new Computable>() { public List compute() { final DocumentationProvider provider = getProviderFromElement(psiElement); return provider.getUrlFor(psiElement, getOriginalElement(psiElement)); } } - ); - BrowserUtil.launchBrowser(urls != null && !urls.isEmpty() ? urls.get(0) : docUrl); - } else { - BrowserUtil.launchBrowser(docUrl); + ); + BrowserUtil.launchBrowser(urls != null && !urls.isEmpty() ? urls.get(0) : docUrl); + } + else { + BrowserUtil.launchBrowser(docUrl); + } + return ""; } - return ""; - } - public PsiElement getElement() { - //String loc = getElementLocator(docUrl); - // - //if (loc != null) { - // PsiElement context = component.getElement(); - // return JavaDocUtil.findReferenceTarget(context.getManager(), loc, context); - //} + public PsiElement getElement() { + //String loc = getElementLocator(docUrl); + // + //if (loc != null) { + // PsiElement context = component.getElement(); + // return JavaDocUtil.findReferenceTarget(context.getManager(), loc, context); + //} - return psiElement; - } - }, component); + return psiElement; + } + }, component); + } } component.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); From 3a40b276dffe1f5bc0e629e26f2539ddb03f59e9 Mon Sep 17 00:00:00 2001 From: Alexey Pegov Date: Wed, 28 Jul 2010 20:12:33 +0400 Subject: [PATCH 47/82] ExternalDocumentationHandler --- .../ExternalDocumentationHandler.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 platform/lang-api/src/com/intellij/lang/documentation/ExternalDocumentationHandler.java diff --git a/platform/lang-api/src/com/intellij/lang/documentation/ExternalDocumentationHandler.java b/platform/lang-api/src/com/intellij/lang/documentation/ExternalDocumentationHandler.java new file mode 100644 index 000000000000..0584d7cff1cd --- /dev/null +++ b/platform/lang-api/src/com/intellij/lang/documentation/ExternalDocumentationHandler.java @@ -0,0 +1,27 @@ +/* + * Copyright 2000-2010 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.lang.documentation; + +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiManager; + +/** + * User: spLeaner + */ +public interface ExternalDocumentationHandler { + boolean handleExternal(PsiElement element, PsiElement originalElement); + boolean handleExternalLink(PsiManager psiManager, String link, PsiElement context); +} From 6d4da0c8e147fdbcf4187910cd3a0e6f653ce1ac Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Wed, 28 Jul 2010 21:49:46 +0400 Subject: [PATCH 48/82] TreeUi: double cancelling issue fix --- .../ide/util/treeView/AbstractTreeUi.java | 19 ++++++++ .../ide/util/treeView/BaseTreeTestCase.java | 6 ++- .../ide/util/treeView/TreeUiTest.java | 43 +++++++++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java index 49b8366e9683..1374fc23378a 100644 --- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java +++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java @@ -1662,10 +1662,20 @@ public class AbstractTreeUi { return result; } + if (myResettingToReadyNow.get()) { + getReady(this).notify(result); + return result; + } + myResettingToReadyNow.set(true); invokeLaterIfNeeded(new Runnable() { public void run() { + if (!myResettingToReadyNow.get()) { + result.setDone(); + return; + } + Progressive[] progressives = myBatchIndicators.keySet().toArray(new Progressive[myBatchIndicators.size()]); for (Progressive each : progressives) { myBatchIndicators.remove(each).cancel(); @@ -1790,6 +1800,10 @@ public class AbstractTreeUi { return isReady(false); } + public boolean isCancelledReady() { + return isReady(false) && myCancelledBuild.size() > 0; + } + public boolean isReady(boolean attempt) { Boolean ready = _isReady(attempt); return ready != null && ready.booleanValue(); @@ -1864,6 +1878,11 @@ public class AbstractTreeUi { try { try { myYeildingPasses.remove(pass); + + if (!canInitiateNewActivity()) { + throw new ProcessCanceledException(); + } + runnable.run(); } finally { diff --git a/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/BaseTreeTestCase.java b/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/BaseTreeTestCase.java index 7d23a5d0bf5d..88220e364d9e 100644 --- a/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/BaseTreeTestCase.java +++ b/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/BaseTreeTestCase.java @@ -394,6 +394,10 @@ abstract class BaseTreeTestCase extends FlyIdeaTestCase { } void select(final Object[] elements, final boolean addToSelection) throws Exception { + select(elements, addToSelection, false); + } + + void select(final Object[] elements, final boolean addToSelection, final boolean canBeInterrupted) throws Exception { final Ref done = new Ref(false); doAndWaitForBuilder(new Runnable() { public void run() { @@ -405,7 +409,7 @@ abstract class BaseTreeTestCase extends FlyIdeaTestCase { } }, new Condition() { public boolean value(Object o) { - return done.get(); + return done.get() || (canBeInterrupted && getBuilder().getUi().isCancelledReady()); } }); } diff --git a/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/TreeUiTest.java b/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/TreeUiTest.java index 84c338e6cc5f..a77bde03d5c5 100644 --- a/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/TreeUiTest.java +++ b/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/TreeUiTest.java @@ -59,6 +59,43 @@ public class TreeUiTest extends AbstractTreeBuilderTest { assertInterruption(Interruption.invokeCancel); } + public void testDoubleCancelUpdate() throws Exception { + buildStructure(myRoot); + + runAndInterrupt(new Runnable() { + @Override + public void run() { + try { + select(new Object[] {new NodeElement("openapi")}, false, true); + } + catch (Exception e) { + fail(); + } + } + }, "getChildren", new NodeElement("intellij"), Interruption.invokeCancel); + + select(new NodeElement("fabrique"), false); + + assertTree("-/\n" + + " -com\n" + + " intellij\n" + + " -jetbrains\n" + + " +[fabrique]\n" + + " +org\n" + + " +xunit\n"); + + updateFromRoot(); + + assertTree("-/\n" + + " -com\n" + + " +intellij\n" + + " -jetbrains\n" + + " +[fabrique]\n" + + " +org\n" + + " +xunit\n"); + + } + public void testBatchUpdate() throws Exception { buildStructure(myRoot); @@ -1987,6 +2024,12 @@ public class TreeUiTest extends AbstractTreeBuilderTest { //todo } + @Override + public void testDoubleCancelUpdate() throws Exception { + // doesn't make sense in pass-through mode + } + + @Override public void testSelectWhenUpdatesArePending() throws Exception { // doesn't make sense in pass-through mode From 27e3ada8a0f47f83e13b0db3e7223d43c74fbc71 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 28 Jul 2010 23:16:03 +0100 Subject: [PATCH 49/82] remove GroovyConstructorUsagesSearchHelper, move logic to the searcher, read-action it --- .../ConstructorReferencesSearcher.java | 14 +- .../GroovyConstructorUsagesSearchHelper.java | 415 ------------------ .../GroovyConstructorUsagesSearcher.java | 385 +++++++++++++++- 3 files changed, 389 insertions(+), 425 deletions(-) delete mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/ConstructorReferencesSearcher.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/ConstructorReferencesSearcher.java index 6af2559d1122..1774fa1970d4 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/ConstructorReferencesSearcher.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/ConstructorReferencesSearcher.java @@ -15,26 +15,30 @@ */ package org.jetbrains.plugins.groovy.findUsages; +import com.intellij.openapi.application.QueryExecutorBase; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiReference; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.util.Processor; -import com.intellij.util.QueryExecutor; /** * @author ven */ -public class ConstructorReferencesSearcher implements QueryExecutor { - public boolean execute(ReferencesSearch.SearchParameters queryParameters, final Processor consumer) { +public class ConstructorReferencesSearcher extends QueryExecutorBase { + protected ConstructorReferencesSearcher() { + super(true); + } + + @Override + public void processQuery(ReferencesSearch.SearchParameters queryParameters, Processor consumer) { final PsiElement element = queryParameters.getElementToSearch(); if (element instanceof PsiMethod) { final PsiMethod method = (PsiMethod)element; if (method.isConstructor()) { - return GroovyConstructorUsagesSearchHelper.processConstructorUsages(method, queryParameters.getScope(), consumer, queryParameters.getOptimizer()); + GroovyConstructorUsagesSearcher.processConstructorUsages(method, queryParameters.getScope(), consumer, queryParameters.getOptimizer()); } } - return true; } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java deleted file mode 100644 index 8b5765b7a1cd..000000000000 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java +++ /dev/null @@ -1,415 +0,0 @@ -/* - * Copyright 2000-2009 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.groovy.findUsages; - -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ProjectRootManager; -import com.intellij.openapi.util.Computable; -import com.intellij.openapi.util.NullableComputable; -import com.intellij.openapi.util.TextRange; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.*; -import com.intellij.psi.impl.light.LightMemberReference; -import com.intellij.psi.search.*; -import com.intellij.psi.search.searches.AnnotatedElementsSearch; -import com.intellij.psi.search.searches.DirectClassInheritorsSearch; -import com.intellij.psi.search.searches.MethodReferencesSearch; -import com.intellij.psi.search.searches.ReferencesSearch; -import com.intellij.psi.util.CachedValueProvider; -import com.intellij.psi.util.CachedValuesManager; -import com.intellij.psi.util.PsiModificationTracker; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.util.PairProcessor; -import com.intellij.util.Processor; -import com.intellij.util.containers.ConcurrentHashSet; -import com.intellij.util.containers.ContainerUtil; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.plugins.groovy.GroovyFileType; -import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils; -import org.jetbrains.plugins.groovy.gpp.GppTypeConverter; -import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement; -import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; -import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; -import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrConstructorInvocation; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrOpenBlock; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.*; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrAnonymousClassDefinition; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstant; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; -import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement; -import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeElement; -import org.jetbrains.plugins.groovy.lang.psi.controlFlow.Instruction; -import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.GroovyExpectedTypesProvider; -import org.jetbrains.plugins.groovy.lang.psi.impl.GrTupleType; -import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -/** - * @author Maxim.Medvedev - * Date: May 2, 2009 3:48:53 PM - */ -public class GroovyConstructorUsagesSearchHelper { - private GroovyConstructorUsagesSearchHelper() { - } - - public static boolean processConstructorUsages(final PsiMethod constructor, final SearchScope searchScope, final Processor consumer, final SearchRequestCollector collector) { - if (!constructor.isConstructor()) return true; - - SearchScope onlyGroovy = searchScope; - if (onlyGroovy instanceof GlobalSearchScope) { - onlyGroovy = GlobalSearchScope.getScopeRestrictedByFileTypes((GlobalSearchScope)onlyGroovy, GroovyFileType.GROOVY_FILE_TYPE); - } - - final PsiClass clazz = ApplicationManager.getApplication().runReadAction(new NullableComputable() { - public PsiClass compute() { - return constructor.getContainingClass(); - } - }); - if (clazz == null) return true; - - - //enum constants - if (!ApplicationManager.getApplication().runReadAction(new Computable() { - public Boolean compute() { - if (!clazz.isEnum()) return true; - if (!(clazz instanceof GroovyPsiElement)) return true; - final PsiField[] fields = clazz.getFields(); - for (PsiField field : fields) { - if (field instanceof GrEnumConstant) { - final PsiReference ref = field.getReference(); - if (ref.isReferenceTo(constructor)) { - if (!consumer.process(ref)) return false; - } - } - } - return true; - } - })) { - return false; - } - - - final Set processedMethods = new ConcurrentHashSet(); - - ReferencesSearch.searchOptimized(clazz, searchScope, true, collector, true, new PairProcessor() { - @Override - public boolean process(PsiReference ref, SearchRequestCollector collector) { - return processClassReference(ref, clazz, constructor, consumer, processedMethods, searchScope, collector); - } - }); - - //this() - if (clazz instanceof GrTypeDefinition) { - if (!processConstructors(constructor, consumer, clazz, true)) { - return false; - } - } - //super : does not work now, need to invent a way for it to work without repository - if (!DirectClassInheritorsSearch.search(clazz, onlyGroovy).forEach(new Processor() { - public boolean process(PsiClass inheritor) { - if (inheritor instanceof GrTypeDefinition) { - if (!processConstructors(constructor, consumer, inheritor, false)) return false; - } - return true; - } - })) { - return false; - } - - return true; - } - - @Nullable - private static PsiMethod getMethodToSearchForCallsWithLiteralArguments(PsiElement element, PsiClass clazz, Set processedMethods) { - final PsiParameter parameter = PsiTreeUtil.getParentOfType(element, PsiParameter.class); - if (parameter != null) { - final PsiMethod method = PsiTreeUtil.getParentOfType(parameter, PsiMethod.class); - if (method != null && processedMethods.add(method) && Arrays.asList(method.getParameterList().getParameters()).contains(parameter)) { - final PsiType parameterType = parameter.getType(); - if (parameterType instanceof PsiClassType) { - if (method.getManager().areElementsEquivalent(clazz, ((PsiClassType)parameterType).resolve())) { - return method; - } - } - } - } - return null; - } - - private static boolean processClassReference(final PsiReference ref, - final PsiClass clazz, - final PsiMethod constructor, - final Processor consumer, - final Set processedMethods, SearchScope scope, SearchRequestCollector collector) { - final PsiElement element = ref.getElement(); - if (element instanceof GrCodeReferenceElement) { - if (!processGroovyConstructorUsages((GrCodeReferenceElement)element, constructor, consumer, ref)) { - return false; - } - - } - - final PsiMethod method = getMethodToSearchForCallsWithLiteralArguments(element, clazz, processedMethods); - if (method != null) { - final GlobalSearchScope gppScope = getGppScope(clazz.getProject()); - MethodReferencesSearch.searchOptimized(method, gppScope.intersectWith(scope), true, collector, true, new PairProcessor() { - @Override - public boolean process(PsiReference psiReference, SearchRequestCollector collector) { - if (psiReference instanceof GrReferenceElement) { - final PsiElement parent = ((GrReferenceElement)psiReference).getParent(); - if (parent instanceof GrCall) { - final GrArgumentList argList = ((GrCall)parent).getArgumentList(); - if (argList != null) { - boolean checkedTypedContext = false; - - for (GrExpression argument : argList.getExpressionArguments()) { - if (argument instanceof GrListOrMap && !((GrListOrMap)argument).isMap()) { - if (!checkedTypedContext) { - if (!GppTypeConverter.hasTypedContext(parent)) { - return true; - } - checkedTypedContext = true; - } - - for (PsiType psiType : GroovyExpectedTypesProvider.getDefaultExpectedTypes(argument)) { - if (psiType instanceof PsiClassType && - clazz.getManager().areElementsEquivalent(clazz,((PsiClassType)psiType).resolve()) && - !checkListInstantiation(constructor, consumer, (GrListOrMap)argument, (PsiClassType)psiType)) { - return false; - } - } - } - } - } - } - } - return true; - } - }); - } - - return true; - } - - private static GlobalSearchScope getGppScope(final Project project) { - return CachedValuesManager.getManager(project).getCachedValue(project, new CachedValueProvider() { - @Override - public Result compute() { - return Result.create(calcGppScope(project), PsiModificationTracker.JAVA_STRUCTURE_MODIFICATION_COUNT, ProjectRootManager.getInstance(project)); - } - }); - } - - private static boolean processGroovyConstructorUsages(GrCodeReferenceElement element, - final PsiMethod constructor, - final Processor consumer, - PsiReference ref) { - PsiElement parent = element.getParent(); - - if (parent instanceof GrAnonymousClassDefinition) { - parent = parent.getParent(); - } - if (parent instanceof GrNewExpression) { - final PsiMethod resolvedConstructor = ((GrNewExpression)parent).resolveConstructor(); - if (constructor.getManager().areElementsEquivalent(resolvedConstructor, constructor) && !consumer.process(ref)) { - return false; - } - } - else if (parent instanceof GrTypeElement) { - final GrTypeElement typeElement = (GrTypeElement)parent; - - final PsiElement grandpa = typeElement.getParent(); - if (grandpa instanceof GrVariableDeclaration) { - final GrVariable[] vars = ((GrVariableDeclaration)grandpa).getVariables(); - if (vars.length == 1) { - final GrVariable variable = vars[0]; - if (!checkListInstantiation(constructor, consumer, variable.getInitializerGroovy(), typeElement)) { - return false; - } - } - } - else if (grandpa instanceof GrMethod) { - final GrMethod method = (GrMethod)grandpa; - if (typeElement == method.getReturnTypeElementGroovy()) { - ControlFlowUtils.visitAllExitPoints(method.getBlock(), new ControlFlowUtils.ExitPointVisitor() { - @Override - public boolean visitExitPoint(Instruction instruction, @Nullable GrExpression returnValue) { - if (!checkListInstantiation(constructor, consumer, returnValue, typeElement)) { - return false; - } - return true; - } - }); - } - } - else if (grandpa instanceof GrTypeCastExpression) { - final GrTypeCastExpression cast = (GrTypeCastExpression)grandpa; - if (cast.getCastTypeElement() == typeElement && - !checkListInstantiation(constructor, consumer, cast.getOperand(), typeElement)) { - return false; - } - } - else if (grandpa instanceof GrSafeCastExpression) { - final GrSafeCastExpression cast = (GrSafeCastExpression)grandpa; - if (cast.getCastTypeElement() == typeElement && - !checkListInstantiation(constructor, consumer, cast.getOperand(), typeElement)) { - return false; - } - } - } - return true; - } - - private static GlobalSearchScope calcGppScope(Project project) { - final GlobalSearchScope allScope = GlobalSearchScope.allScope(project); - final GlobalSearchScope maximal = GlobalSearchScope.getScopeRestrictedByFileTypes(allScope, GroovyFileType.GROOVY_FILE_TYPE); - GlobalSearchScope gppExtensions = new DelegatingGlobalSearchScope(maximal) { - @Override - public boolean contains(VirtualFile file) { - return super.contains(file) && GppTypeConverter.isGppExtension(file.getExtension()); - } - }; - final PsiClass typed = JavaPsiFacade.getInstance(project).findClass(GppTypeConverter.GROOVY_LANG_TYPED, allScope); - if (typed != null) { - final Set files = new HashSet(); - AnnotatedElementsSearch.searchElements(typed, maximal, PsiModifierListOwner.class).forEach(new Processor() { - @Override - public boolean process(PsiModifierListOwner occurrence) { - ContainerUtil.addIfNotNull(occurrence.getContainingFile().getVirtualFile(), files); - return true; - } - }); - - GlobalSearchScope withTypedAnno = GlobalSearchScope.filesScope(project, files); - return withTypedAnno.union(gppExtensions); - } - - return gppExtensions; - } - - private static boolean checkListInstantiation(PsiMethod constructor, - Processor consumer, - GrExpression expression, final GrTypeElement typeElement) { - if (expression instanceof GrListOrMap) { - final GrListOrMap list = (GrListOrMap)expression; - if (!list.isMap()) { - final PsiType expectedType = typeElement.getType(); - if (expectedType instanceof PsiClassType) { - return checkListInstantiation(constructor, consumer, list, (PsiClassType)expectedType); - } - } - } - return true; - } - - private static boolean checkListInstantiation(PsiMethod constructor, - Processor consumer, - GrListOrMap list, - PsiClassType expectedType) { - final PsiType listType = list.getType(); - if (listType instanceof GrTupleType) { - for (GroovyResolveResult candidate : PsiUtil.getConstructorCandidates(expectedType, ((GrTupleType)listType).getComponentTypes(), list)) { - if (constructor.getManager().areElementsEquivalent(candidate.getElement(), constructor)) { - if (!consumer.process(PsiReferenceBase.createSelfReference(list, TextRange.from(0, list.getTextLength()), constructor))) { - return false; - } - } - } - } - return true; - } - - private static boolean processConstructors(final PsiMethod constructor, final Processor consumer, final PsiClass clazz, - final boolean processThisRefs) { - return ApplicationManager.getApplication().runReadAction(new Computable() { - public Boolean compute() { - return processClassConstructors(clazz, constructor, consumer, processThisRefs); - } - }); - } - - private static boolean processClassConstructors(PsiClass clazz, - PsiMethod searchedConstructor, - Processor consumer, - boolean processThisRefs) { - final PsiMethod[] constructors = clazz.getConstructors(); - if (constructors.length == 0) { - processImplicitConstructorCall(clazz, consumer, searchedConstructor); - } - for (PsiMethod constructor : constructors) { - final GrOpenBlock block = ((GrMethod)constructor).getBlock(); - if (block != null) { - final GrStatement[] statements = block.getStatements(); - if (statements.length > 0 && statements[0] instanceof GrConstructorInvocation) { - final GrConstructorInvocation invocation = (GrConstructorInvocation)statements[0]; - if (invocation.isThisCall() == processThisRefs && - invocation.getManager().areElementsEquivalent(invocation.resolveConstructor(), searchedConstructor) && - !consumer.process(invocation)) { - return false; - } - } - else { - processImplicitConstructorCall(constructor, consumer, searchedConstructor); - } - } - } - return true; - } - - private static void processImplicitConstructorCall(final PsiMember usage, - final Processor processor, - final PsiMethod constructor) { - if (constructor instanceof GrMethod) { - GrParameter[] grParameters = (GrParameter[])constructor.getParameterList().getParameters(); - if (grParameters.length > 0 && !grParameters[0].isOptional()) return; - } - else if (constructor.getParameterList().getParameters().length > 0) return; - - - PsiManager manager = constructor.getManager(); - if (manager.areElementsEquivalent(usage, constructor) || manager.areElementsEquivalent(constructor.getContainingClass(), usage.getContainingClass())) return; - processor.process(new LightMemberReference(manager, usage, PsiSubstitutor.EMPTY) { - public PsiElement getElement() { - return usage; - } - - public TextRange getRangeInElement() { - if (usage instanceof PsiClass) { - PsiIdentifier identifier = ((PsiClass)usage).getNameIdentifier(); - if (identifier != null) return TextRange.from(identifier.getStartOffsetInParent(), identifier.getTextLength()); - } - else if (usage instanceof PsiMethod) { - PsiIdentifier identifier = ((PsiMethod)usage).getNameIdentifier(); - if (identifier != null) return TextRange.from(identifier.getStartOffsetInParent(), identifier.getTextLength()); - } - return super.getRangeInElement(); - } - }); - - } -} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearcher.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearcher.java index 8a2a8ebbfa36..4b1c7a9515fc 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearcher.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearcher.java @@ -16,16 +16,391 @@ package org.jetbrains.plugins.groovy.findUsages; -import com.intellij.psi.PsiReference; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.QueryExecutorBase; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.*; +import com.intellij.psi.impl.light.LightMemberReference; +import com.intellij.psi.search.DelegatingGlobalSearchScope; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.SearchRequestCollector; +import com.intellij.psi.search.SearchScope; +import com.intellij.psi.search.searches.AnnotatedElementsSearch; +import com.intellij.psi.search.searches.DirectClassInheritorsSearch; import com.intellij.psi.search.searches.MethodReferencesSearch; +import com.intellij.psi.search.searches.ReferencesSearch; +import com.intellij.psi.util.CachedValueProvider; +import com.intellij.psi.util.CachedValuesManager; +import com.intellij.psi.util.PsiModificationTracker; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.PairProcessor; import com.intellij.util.Processor; -import com.intellij.util.QueryExecutor; +import com.intellij.util.containers.ConcurrentHashSet; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.GroovyFileType; +import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils; +import org.jetbrains.plugins.groovy.gpp.GppTypeConverter; +import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement; +import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; +import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrConstructorInvocation; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrOpenBlock; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.*; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrAnonymousClassDefinition; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstant; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; +import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement; +import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeElement; +import org.jetbrains.plugins.groovy.lang.psi.controlFlow.Instruction; +import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.GroovyExpectedTypesProvider; +import org.jetbrains.plugins.groovy.lang.psi.impl.GrTupleType; +import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; /** * @author Maxim.Medvedev */ -public class GroovyConstructorUsagesSearcher implements QueryExecutor { - public boolean execute(MethodReferencesSearch.SearchParameters p, final Processor consumer) { - return GroovyConstructorUsagesSearchHelper.processConstructorUsages(p.getMethod(), p.getScope(), consumer, p.getOptimizer()); +public class GroovyConstructorUsagesSearcher extends QueryExecutorBase { + public GroovyConstructorUsagesSearcher() { + super(true); } + + @Override + public void processQuery(MethodReferencesSearch.SearchParameters p, Processor consumer) { + processConstructorUsages(p.getMethod(), p.getScope(), consumer, p.getOptimizer()); + } + + static void processConstructorUsages(final PsiMethod constructor, final SearchScope searchScope, final Processor consumer, final SearchRequestCollector collector) { + if (!constructor.isConstructor()) return; + + SearchScope onlyGroovy = searchScope; + if (onlyGroovy instanceof GlobalSearchScope) { + onlyGroovy = GlobalSearchScope.getScopeRestrictedByFileTypes((GlobalSearchScope)onlyGroovy, GroovyFileType.GROOVY_FILE_TYPE); + } + + final PsiClass clazz = constructor.getContainingClass(); + if (clazz == null) return; + + + if (clazz.isEnum() && clazz instanceof GroovyPsiElement) { + for (PsiField field : clazz.getFields()) { + if (field instanceof GrEnumConstant) { + final PsiReference ref = field.getReference(); + if (ref != null && ref.isReferenceTo(constructor)) { + if (!consumer.process(ref)) return; + } + } + } + } + + final Set processedMethods = new ConcurrentHashSet(); + + ReferencesSearch.searchOptimized(clazz, searchScope, true, collector, true, new PairProcessor() { + @Override + public boolean process(PsiReference ref, SearchRequestCollector collector) { + return processClassReference(ref, clazz, constructor, consumer, processedMethods, searchScope, collector); + } + }); + + //this() + if (clazz instanceof GrTypeDefinition) { + if (!processConstructors(constructor, consumer, clazz, true)) { + return; + } + } + //super() + DirectClassInheritorsSearch.search(clazz, onlyGroovy).forEach(new Processor() { + public boolean process(PsiClass inheritor) { + if (inheritor instanceof GrTypeDefinition) { + if (!processConstructors(constructor, consumer, inheritor, false)) return false; + } + return true; + } + }); + } + + @Nullable + static PsiMethod getMethodToSearchForCallsWithLiteralArguments(PsiElement element, PsiClass clazz, Set processedMethods) { + final PsiParameter parameter = PsiTreeUtil.getParentOfType(element, PsiParameter.class); + if (parameter != null) { + final PsiMethod method = PsiTreeUtil.getParentOfType(parameter, PsiMethod.class); + if (method != null && processedMethods.add(method) && Arrays.asList(method.getParameterList().getParameters()).contains(parameter)) { + final PsiType parameterType = parameter.getType(); + if (parameterType instanceof PsiClassType) { + if (method.getManager().areElementsEquivalent(clazz, ((PsiClassType)parameterType).resolve())) { + return method; + } + } + } + } + return null; + } + + static boolean processClassReference(final PsiReference ref, + final PsiClass clazz, + final PsiMethod constructor, + final Processor consumer, + final Set processedMethods, SearchScope scope, SearchRequestCollector collector) { + final PsiElement element = ref.getElement(); + if (element instanceof GrCodeReferenceElement) { + if (!processGroovyConstructorUsages((GrCodeReferenceElement)element, constructor, consumer, ref)) { + return false; + } + + } + + final PsiMethod method = getMethodToSearchForCallsWithLiteralArguments(element, clazz, processedMethods); + if (method != null) { + final GlobalSearchScope gppScope = getGppScope(clazz.getProject()); + MethodReferencesSearch.searchOptimized(method, gppScope.intersectWith(scope), true, collector, true, new PairProcessor() { + @Override + public boolean process(PsiReference psiReference, SearchRequestCollector collector) { + if (psiReference instanceof GrReferenceElement) { + final PsiElement parent = ((GrReferenceElement)psiReference).getParent(); + if (parent instanceof GrCall) { + final GrArgumentList argList = ((GrCall)parent).getArgumentList(); + if (argList != null) { + boolean checkedTypedContext = false; + + for (GrExpression argument : argList.getExpressionArguments()) { + if (argument instanceof GrListOrMap && !((GrListOrMap)argument).isMap()) { + if (!checkedTypedContext) { + if (!GppTypeConverter.hasTypedContext(parent)) { + return true; + } + checkedTypedContext = true; + } + + for (PsiType psiType : GroovyExpectedTypesProvider.getDefaultExpectedTypes(argument)) { + if (psiType instanceof PsiClassType && + clazz.getManager().areElementsEquivalent(clazz,((PsiClassType)psiType).resolve()) && + !checkListInstantiation(constructor, consumer, (GrListOrMap)argument, (PsiClassType)psiType)) { + return false; + } + } + } + } + } + } + } + return true; + } + }); + } + + return true; + } + + static GlobalSearchScope getGppScope(final Project project) { + return CachedValuesManager.getManager(project).getCachedValue(project, new CachedValueProvider() { + @Override + public Result compute() { + return Result.create(calcGppScope(project), PsiModificationTracker.JAVA_STRUCTURE_MODIFICATION_COUNT, ProjectRootManager.getInstance(project)); + } + }); + } + + static boolean processGroovyConstructorUsages(GrCodeReferenceElement element, + final PsiMethod constructor, + final Processor consumer, + PsiReference ref) { + PsiElement parent = element.getParent(); + + if (parent instanceof GrAnonymousClassDefinition) { + parent = parent.getParent(); + } + if (parent instanceof GrNewExpression) { + final PsiMethod resolvedConstructor = ((GrNewExpression)parent).resolveConstructor(); + if (constructor.getManager().areElementsEquivalent(resolvedConstructor, constructor) && !consumer.process(ref)) { + return false; + } + } + else if (parent instanceof GrTypeElement) { + final GrTypeElement typeElement = (GrTypeElement)parent; + + final PsiElement grandpa = typeElement.getParent(); + if (grandpa instanceof GrVariableDeclaration) { + final GrVariable[] vars = ((GrVariableDeclaration)grandpa).getVariables(); + if (vars.length == 1) { + final GrVariable variable = vars[0]; + if (!checkListInstantiation(constructor, consumer, variable.getInitializerGroovy(), typeElement)) { + return false; + } + } + } + else if (grandpa instanceof GrMethod) { + final GrMethod method = (GrMethod)grandpa; + if (typeElement == method.getReturnTypeElementGroovy()) { + ControlFlowUtils.visitAllExitPoints(method.getBlock(), new ControlFlowUtils.ExitPointVisitor() { + @Override + public boolean visitExitPoint(Instruction instruction, @Nullable GrExpression returnValue) { + if (!checkListInstantiation(constructor, consumer, returnValue, typeElement)) { + return false; + } + return true; + } + }); + } + } + else if (grandpa instanceof GrTypeCastExpression) { + final GrTypeCastExpression cast = (GrTypeCastExpression)grandpa; + if (cast.getCastTypeElement() == typeElement && + !checkListInstantiation(constructor, consumer, cast.getOperand(), typeElement)) { + return false; + } + } + else if (grandpa instanceof GrSafeCastExpression) { + final GrSafeCastExpression cast = (GrSafeCastExpression)grandpa; + if (cast.getCastTypeElement() == typeElement && + !checkListInstantiation(constructor, consumer, cast.getOperand(), typeElement)) { + return false; + } + } + } + return true; + } + + static GlobalSearchScope calcGppScope(Project project) { + final GlobalSearchScope allScope = GlobalSearchScope.allScope(project); + final GlobalSearchScope maximal = GlobalSearchScope.getScopeRestrictedByFileTypes(allScope, GroovyFileType.GROOVY_FILE_TYPE); + GlobalSearchScope gppExtensions = new DelegatingGlobalSearchScope(maximal) { + @Override + public boolean contains(VirtualFile file) { + return super.contains(file) && GppTypeConverter.isGppExtension(file.getExtension()); + } + }; + final PsiClass typed = JavaPsiFacade.getInstance(project).findClass(GppTypeConverter.GROOVY_LANG_TYPED, allScope); + if (typed != null) { + final Set files = new HashSet(); + AnnotatedElementsSearch.searchElements(typed, maximal, PsiModifierListOwner.class).forEach(new Processor() { + @Override + public boolean process(PsiModifierListOwner occurrence) { + ContainerUtil.addIfNotNull(occurrence.getContainingFile().getVirtualFile(), files); + return true; + } + }); + + GlobalSearchScope withTypedAnno = GlobalSearchScope.filesScope(project, files); + return withTypedAnno.union(gppExtensions); + } + + return gppExtensions; + } + + static boolean checkListInstantiation(PsiMethod constructor, + Processor consumer, + GrExpression expression, final GrTypeElement typeElement) { + if (expression instanceof GrListOrMap) { + final GrListOrMap list = (GrListOrMap)expression; + if (!list.isMap()) { + final PsiType expectedType = typeElement.getType(); + if (expectedType instanceof PsiClassType) { + return checkListInstantiation(constructor, consumer, list, (PsiClassType)expectedType); + } + } + } + return true; + } + + static boolean checkListInstantiation(PsiMethod constructor, + Processor consumer, + GrListOrMap list, + PsiClassType expectedType) { + final PsiType listType = list.getType(); + if (listType instanceof GrTupleType) { + for (GroovyResolveResult candidate : PsiUtil.getConstructorCandidates(expectedType, ((GrTupleType)listType).getComponentTypes(), list)) { + if (constructor.getManager().areElementsEquivalent(candidate.getElement(), constructor)) { + if (!consumer.process(PsiReferenceBase.createSelfReference(list, TextRange.from(0, list.getTextLength()), constructor))) { + return false; + } + } + } + } + return true; + } + + static boolean processConstructors(final PsiMethod constructor, final Processor consumer, final PsiClass clazz, + final boolean processThisRefs) { + return ApplicationManager.getApplication().runReadAction(new Computable() { + public Boolean compute() { + return processClassConstructors(clazz, constructor, consumer, processThisRefs); + } + }); + } + + static boolean processClassConstructors(PsiClass clazz, + PsiMethod searchedConstructor, + Processor consumer, + boolean processThisRefs) { + final PsiMethod[] constructors = clazz.getConstructors(); + if (constructors.length == 0) { + processImplicitConstructorCall(clazz, consumer, searchedConstructor); + } + for (PsiMethod constructor : constructors) { + final GrOpenBlock block = ((GrMethod)constructor).getBlock(); + if (block != null) { + final GrStatement[] statements = block.getStatements(); + if (statements.length > 0 && statements[0] instanceof GrConstructorInvocation) { + final GrConstructorInvocation invocation = (GrConstructorInvocation)statements[0]; + if (invocation.isThisCall() == processThisRefs && + invocation.getManager().areElementsEquivalent(invocation.resolveConstructor(), searchedConstructor) && + !consumer.process(invocation)) { + return false; + } + } + else { + processImplicitConstructorCall(constructor, consumer, searchedConstructor); + } + } + } + return true; + } + + static void processImplicitConstructorCall(final PsiMember usage, + final Processor processor, + final PsiMethod constructor) { + if (constructor instanceof GrMethod) { + GrParameter[] grParameters = (GrParameter[])constructor.getParameterList().getParameters(); + if (grParameters.length > 0 && !grParameters[0].isOptional()) return; + } + else if (constructor.getParameterList().getParameters().length > 0) return; + + + PsiManager manager = constructor.getManager(); + if (manager.areElementsEquivalent(usage, constructor) || manager.areElementsEquivalent(constructor.getContainingClass(), usage.getContainingClass())) return; + processor.process(new LightMemberReference(manager, usage, PsiSubstitutor.EMPTY) { + public PsiElement getElement() { + return usage; + } + + public TextRange getRangeInElement() { + if (usage instanceof PsiClass) { + PsiIdentifier identifier = ((PsiClass)usage).getNameIdentifier(); + if (identifier != null) return TextRange.from(identifier.getStartOffsetInParent(), identifier.getTextLength()); + } + else if (usage instanceof PsiMethod) { + PsiIdentifier identifier = ((PsiMethod)usage).getNameIdentifier(); + if (identifier != null) return TextRange.from(identifier.getStartOffsetInParent(), identifier.getTextLength()); + } + return super.getRangeInElement(); + } + }); + + } + } From 0130db72e18dcc5a8d0466e3ea0902d8b83d5961 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 28 Jul 2010 23:47:44 +0100 Subject: [PATCH 50/82] more efficient literals in g++ calls search --- .../searches/MethodReferencesSearch.java | 17 ++- .../ConstructorReferencesSearcher.java | 2 +- .../GroovyConstructorUsagesSearcher.java | 108 ++++++++++-------- 3 files changed, 71 insertions(+), 56 deletions(-) diff --git a/java/openapi/src/com/intellij/psi/search/searches/MethodReferencesSearch.java b/java/openapi/src/com/intellij/psi/search/searches/MethodReferencesSearch.java index a29b98613b42..dfa15c5399c4 100644 --- a/java/openapi/src/com/intellij/psi/search/searches/MethodReferencesSearch.java +++ b/java/openapi/src/com/intellij/psi/search/searches/MethodReferencesSearch.java @@ -18,11 +18,9 @@ package com.intellij.psi.search.searches; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiReference; import com.intellij.psi.search.*; -import com.intellij.util.MergeQuery; -import com.intellij.util.PairProcessor; -import com.intellij.util.Query; -import com.intellij.util.UniqueResultsQuery; +import com.intellij.util.*; import gnu.trove.TObjectHashingStrategy; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -73,7 +71,16 @@ public class MethodReferencesSearch extends ExtensibleQueryFactory processor) { + public static void searchOptimized(final PsiMethod method, SearchScope scope, final boolean strictSignatureSearch, + @NotNull SearchRequestCollector collector, final Processor processor) { + searchOptimized(method, scope, strictSignatureSearch, collector, false, new PairProcessor() { + @Override + public boolean process(PsiReference psiReference, SearchRequestCollector collector) { + return processor.process(psiReference); + } + }); + } +public static void searchOptimized(final PsiMethod method, SearchScope scope, final boolean strictSignatureSearch, SearchRequestCollector collector, final boolean inReadAction, PairProcessor processor) { final SearchRequestCollector nested = new SearchRequestCollector(); collector.searchQuery(new QuerySearchRequest(search(new SearchParameters(method, scope, strictSignatureSearch, nested)), nested, inReadAction, processor)); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/ConstructorReferencesSearcher.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/ConstructorReferencesSearcher.java index 1774fa1970d4..1e8ee89c70ff 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/ConstructorReferencesSearcher.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/ConstructorReferencesSearcher.java @@ -36,7 +36,7 @@ public class ConstructorReferencesSearcher extends QueryExecutorBase consumer) { - processConstructorUsages(p.getMethod(), p.getScope(), consumer, p.getOptimizer()); + processConstructorUsages(p.getMethod(), p.getScope(), consumer, p.getOptimizer(), true); } - static void processConstructorUsages(final PsiMethod constructor, final SearchScope searchScope, final Processor consumer, final SearchRequestCollector collector) { + static void processConstructorUsages(final PsiMethod constructor, final SearchScope searchScope, final Processor consumer, final SearchRequestCollector collector, final boolean searchGppCalls) { if (!constructor.isConstructor()) return; SearchScope onlyGroovy = searchScope; @@ -113,7 +115,20 @@ public class GroovyConstructorUsagesSearcher extends QueryExecutorBase() { @Override public boolean process(PsiReference ref, SearchRequestCollector collector) { - return processClassReference(ref, clazz, constructor, consumer, processedMethods, searchScope, collector); + final PsiElement element = ref.getElement(); + if (element instanceof GrCodeReferenceElement) { + if (!processGroovyConstructorUsages((GrCodeReferenceElement)element, constructor, consumer, ref, !searchGppCalls)) { + return false; + } + } + + if (searchGppCalls) { + final PsiMethod method = getMethodToSearchForCallsWithLiteralArguments(element, clazz); + if (method != null && processedMethods.add(method)) { + processGppMethodCalls(clazz, constructor, consumer, searchScope, collector, method); + } + } + return true; } }); @@ -135,14 +150,14 @@ public class GroovyConstructorUsagesSearcher extends QueryExecutorBase processedMethods) { + static PsiMethod getMethodToSearchForCallsWithLiteralArguments(PsiElement element, PsiClass targetClass) { final PsiParameter parameter = PsiTreeUtil.getParentOfType(element, PsiParameter.class); if (parameter != null) { final PsiMethod method = PsiTreeUtil.getParentOfType(parameter, PsiMethod.class); - if (method != null && processedMethods.add(method) && Arrays.asList(method.getParameterList().getParameters()).contains(parameter)) { + if (method != null && Arrays.asList(method.getParameterList().getParameters()).contains(parameter)) { final PsiType parameterType = parameter.getType(); if (parameterType instanceof PsiClassType) { - if (method.getManager().areElementsEquivalent(clazz, ((PsiClassType)parameterType).resolve())) { + if (method.getManager().areElementsEquivalent(targetClass, ((PsiClassType)parameterType).resolve())) { return method; } } @@ -151,59 +166,52 @@ public class GroovyConstructorUsagesSearcher extends QueryExecutorBase consumer, - final Set processedMethods, SearchScope scope, SearchRequestCollector collector) { - final PsiElement element = ref.getElement(); - if (element instanceof GrCodeReferenceElement) { - if (!processGroovyConstructorUsages((GrCodeReferenceElement)element, constructor, consumer, ref)) { - return false; - } + private static void processGppMethodCalls(final PsiClass targetClass, + final PsiMethod originalTarget, + final Processor originalProcessor, + SearchScope scope, + SearchRequestCollector originalCollector, @NotNull PsiMethod currentTarget) { + final SearchScope gppScope = getGppScope(targetClass.getProject()).intersectWith(scope); + final ReadActionProcessor gppCallProcessor = new ReadActionProcessor() { + @Override + public boolean processInReadAction(PsiReference psiReference) { + if (psiReference instanceof GrReferenceElement) { + final PsiElement parent = ((GrReferenceElement)psiReference).getParent(); + if (parent instanceof GrCall) { + final GrArgumentList argList = ((GrCall)parent).getArgumentList(); + if (argList != null) { + boolean checkedTypedContext = false; - } - - final PsiMethod method = getMethodToSearchForCallsWithLiteralArguments(element, clazz, processedMethods); - if (method != null) { - final GlobalSearchScope gppScope = getGppScope(clazz.getProject()); - MethodReferencesSearch.searchOptimized(method, gppScope.intersectWith(scope), true, collector, true, new PairProcessor() { - @Override - public boolean process(PsiReference psiReference, SearchRequestCollector collector) { - if (psiReference instanceof GrReferenceElement) { - final PsiElement parent = ((GrReferenceElement)psiReference).getParent(); - if (parent instanceof GrCall) { - final GrArgumentList argList = ((GrCall)parent).getArgumentList(); - if (argList != null) { - boolean checkedTypedContext = false; - - for (GrExpression argument : argList.getExpressionArguments()) { - if (argument instanceof GrListOrMap && !((GrListOrMap)argument).isMap()) { - if (!checkedTypedContext) { - if (!GppTypeConverter.hasTypedContext(parent)) { - return true; - } - checkedTypedContext = true; + for (GrExpression argument : argList.getExpressionArguments()) { + if (argument instanceof GrListOrMap && !((GrListOrMap)argument).isMap()) { + if (!checkedTypedContext) { + if (!GppTypeConverter.hasTypedContext(parent)) { + return true; } + checkedTypedContext = true; + } - for (PsiType psiType : GroovyExpectedTypesProvider.getDefaultExpectedTypes(argument)) { - if (psiType instanceof PsiClassType && - clazz.getManager().areElementsEquivalent(clazz,((PsiClassType)psiType).resolve()) && - !checkListInstantiation(constructor, consumer, (GrListOrMap)argument, (PsiClassType)psiType)) { - return false; - } + for (PsiType psiType : GroovyExpectedTypesProvider.getDefaultExpectedTypes(argument)) { + if (psiType instanceof PsiClassType && + targetClass.getManager().areElementsEquivalent(targetClass, ((PsiClassType)psiType).resolve()) && + !checkListInstantiation(originalTarget, originalProcessor, (GrListOrMap)argument, (PsiClassType)psiType)) { + return false; } } } } } } - return true; } - }); + return true; + } + }; + if (currentTarget.isConstructor()) { + processConstructorUsages(currentTarget, gppScope, gppCallProcessor, originalCollector, false); + } + else { + MethodReferencesSearch.searchOptimized(currentTarget, gppScope, true, originalCollector, gppCallProcessor); } - - return true; } static GlobalSearchScope getGppScope(final Project project) { @@ -218,7 +226,7 @@ public class GroovyConstructorUsagesSearcher extends QueryExecutorBase consumer, - PsiReference ref) { + PsiReference ref, boolean usualCallsOnly) { PsiElement parent = element.getParent(); if (parent instanceof GrAnonymousClassDefinition) { @@ -230,7 +238,7 @@ public class GroovyConstructorUsagesSearcher extends QueryExecutorBase Date: Mon, 26 Jul 2010 19:02:35 +0100 Subject: [PATCH 51/82] insert paired brace before the closing brace or punctuation in the custom file type --- .../psi/CustomHighlighterTokenType.java | 1 + .../custom/CustomFileTypeLexer.java | 1 + .../impl/CustomFileTypeBraceMatcher.java | 8 +++- .../custom/tokens/PunctuationParser.java | 39 +++++++++++++++++++ 4 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 platform/lang-impl/src/com/intellij/ide/highlighter/custom/tokens/PunctuationParser.java diff --git a/platform/lang-api/src/com/intellij/psi/CustomHighlighterTokenType.java b/platform/lang-api/src/com/intellij/psi/CustomHighlighterTokenType.java index 505b52cbeaa2..41ae1093e409 100644 --- a/platform/lang-api/src/com/intellij/psi/CustomHighlighterTokenType.java +++ b/platform/lang-api/src/com/intellij/psi/CustomHighlighterTokenType.java @@ -45,6 +45,7 @@ public interface CustomHighlighterTokenType { IElementType MULTI_LINE_COMMENT = new CustomElementType("MULTI_LINE_COMMENT"); IElementType WHITESPACE = new CustomElementType("WHITESPACE"); IElementType CHARACTER = new CustomElementType("CHARACTER"); + IElementType PUNCTUATION = new CustomElementType("PUNCTUATION"); IElementType L_BRACE = new CustomElementType("L_BRACE"); IElementType R_BRACE = new CustomElementType("R_BRACE"); diff --git a/platform/lang-impl/src/com/intellij/ide/highlighter/custom/CustomFileTypeLexer.java b/platform/lang-impl/src/com/intellij/ide/highlighter/custom/CustomFileTypeLexer.java index c31f41735c91..6506934c0c73 100644 --- a/platform/lang-impl/src/com/intellij/ide/highlighter/custom/CustomFileTypeLexer.java +++ b/platform/lang-impl/src/com/intellij/ide/highlighter/custom/CustomFileTypeLexer.java @@ -65,6 +65,7 @@ public final class CustomFileTypeLexer extends AbstractCustomLexer { tokenParsers.add(multilineCommentParser); } tokenParsers.add(numberParser); + tokenParsers.add(new PunctuationParser()); if (hexNumberParser != null) { tokenParsers.add(hexNumberParser); } diff --git a/platform/lang-impl/src/com/intellij/ide/highlighter/custom/impl/CustomFileTypeBraceMatcher.java b/platform/lang-impl/src/com/intellij/ide/highlighter/custom/impl/CustomFileTypeBraceMatcher.java index 1c099650b269..684ab7972e54 100644 --- a/platform/lang-impl/src/com/intellij/ide/highlighter/custom/impl/CustomFileTypeBraceMatcher.java +++ b/platform/lang-impl/src/com/intellij/ide/highlighter/custom/impl/CustomFileTypeBraceMatcher.java @@ -42,8 +42,10 @@ class CustomFileTypeBraceMatcher implements BraceMatcher { } public boolean isRBraceToken(HighlighterIterator iterator, CharSequence fileText, FileType fileType) { - final IElementType tokenType = iterator.getTokenType(); + return isRBraceToken(iterator.getTokenType()); + } + private static boolean isRBraceToken(IElementType tokenType) { return tokenType == CustomHighlighterTokenType.R_BRACKET || tokenType == CustomHighlighterTokenType.R_PARENTH || tokenType == CustomHighlighterTokenType.R_BRACE; @@ -80,7 +82,9 @@ class CustomFileTypeBraceMatcher implements BraceMatcher { } public boolean isPairedBracesAllowedBeforeType(@NotNull final IElementType lbraceType, @Nullable final IElementType contextType) { - return contextType == CustomHighlighterTokenType.WHITESPACE; + return contextType == CustomHighlighterTokenType.PUNCTUATION || + contextType == CustomHighlighterTokenType.WHITESPACE || + isRBraceToken(contextType); } public int getCodeConstructStart(final PsiFile file, final int openingBraceOffset) { diff --git a/platform/lang-impl/src/com/intellij/ide/highlighter/custom/tokens/PunctuationParser.java b/platform/lang-impl/src/com/intellij/ide/highlighter/custom/tokens/PunctuationParser.java new file mode 100644 index 000000000000..e097e4df887b --- /dev/null +++ b/platform/lang-impl/src/com/intellij/ide/highlighter/custom/tokens/PunctuationParser.java @@ -0,0 +1,39 @@ +/* + * Copyright 2000-2009 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.ide.highlighter.custom.tokens; + +import com.intellij.psi.CustomHighlighterTokenType; + +/** + * @author peter + */ +public class PunctuationParser extends BaseTokenParser { + @Override + public boolean hasToken(int position) { + final char c = myBuffer.charAt(position); + if (".,:;".indexOf(c) >= 0) { + myTokenInfo.updateData(position, position+1, CustomHighlighterTokenType.PUNCTUATION); + return true; + } + return false; + } + + @Override + public int getSmartUpdateShift() { + return 0; + } +} From 2086027d2496449957c8a8ea8efe81c695cb5b90 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 26 Jul 2010 20:29:44 +0100 Subject: [PATCH 52/82] move the groovy constructor-resolving method to a more appropriate place --- .../gpp/GppClosureParameterTypeProvider.java | 3 ++- .../gpp/GppExpectedTypesContributor.java | 3 ++- .../plugins/groovy/gpp/GppTypeConverter.java | 18 +----------------- .../plugins/groovy/lang/psi/util/PsiUtil.java | 15 +++++++++++++++ 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppClosureParameterTypeProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppClosureParameterTypeProvider.java index 452a310bdead..47e863de80d6 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppClosureParameterTypeProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppClosureParameterTypeProvider.java @@ -19,6 +19,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpres import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.GroovyExpectedTypesProvider; import org.jetbrains.plugins.groovy.lang.psi.impl.GrTupleType; import org.jetbrains.plugins.groovy.lang.psi.impl.types.GrClosureSignatureUtil; +import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import java.util.*; @@ -49,7 +50,7 @@ public class GppClosureParameterTypeProvider extends AbstractClosureParameterEnh if (listType instanceof GrTupleType) { for (PsiType type : GroovyExpectedTypesProvider.getDefaultExpectedTypes(list)) { if (type instanceof PsiClassType) { - for (GroovyResolveResult resolveResult : GppTypeConverter + for (GroovyResolveResult resolveResult : PsiUtil .getConstructorCandidates((PsiClassType)type, ((GrTupleType)listType).getComponentTypes(), closure)) { final PsiElement method = resolveResult.getElement(); if (method instanceof PsiMethod && ((PsiMethod)method).isConstructor()) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppExpectedTypesContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppExpectedTypesContributor.java index 6266d2b15af1..5937224292b1 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppExpectedTypesContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppExpectedTypesContributor.java @@ -10,6 +10,7 @@ import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.GroovyExpectedTypesPr import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.SubtypeConstraint; import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.TypeConstraint; import org.jetbrains.plugins.groovy.lang.psi.impl.GrTupleType; +import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import java.util.ArrayList; import java.util.Arrays; @@ -48,7 +49,7 @@ public class GppExpectedTypesContributor extends GroovyExpectedTypesContributor final ArrayList result = new ArrayList(); for (PsiType type : GroovyExpectedTypesProvider.getDefaultExpectedTypes(expression)) { if (type instanceof PsiClassType) { - for (GroovyResolveResult resolveResult : GppTypeConverter.getConstructorCandidates((PsiClassType)type, argTypes, expression)) { + for (GroovyResolveResult resolveResult : PsiUtil.getConstructorCandidates((PsiClassType)type, argTypes, expression)) { final PsiElement method = resolveResult.getElement(); if (method instanceof PsiMethod && ((PsiMethod)method).isConstructor()) { final PsiParameter[] constructorParameters = ((PsiMethod)method).getParameterList().getParameters(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java index a41d82ebd46e..3a4ea0680f77 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java @@ -7,12 +7,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.dsl.toplevel.AnnotatedContextFilter; import org.jetbrains.plugins.groovy.lang.psi.GrTypeConverter; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; -import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrClosureSignature; import org.jetbrains.plugins.groovy.lang.psi.impl.GrClosureType; import org.jetbrains.plugins.groovy.lang.psi.impl.GrMapType; import org.jetbrains.plugins.groovy.lang.psi.impl.GrTupleType; -import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyResolveResultImpl; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; import org.jetbrains.plugins.groovy.lang.psi.impl.types.GrClosureSignatureUtil; @@ -93,21 +91,7 @@ public class GppTypeConverter extends GrTypeConverter { } private static boolean hasConstructor(PsiClassType lType, PsiType[] argTypes, GroovyPsiElement context) { - return getConstructorCandidates(lType, argTypes, context).length == 1; - } - - public static GroovyResolveResult[] getConstructorCandidates(PsiClassType classType, PsiType[] argTypes, GroovyPsiElement context) { - final PsiClassType.ClassResolveResult resolveResult = classType.resolveGenerics(); - final PsiClass psiClass = resolveResult.getElement(); - final PsiSubstitutor substitutor = resolveResult.getSubstitutor(); - if (psiClass == null) { - return GroovyResolveResult.EMPTY_ARRAY; - } - - final GroovyResolveResult grResult = resolveResult instanceof GroovyResolveResult - ? (GroovyResolveResult)resolveResult - : new GroovyResolveResultImpl(psiClass, context, substitutor, true, true); - return org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil.getConstructorCandidates(context, new GroovyResolveResult[]{grResult}, argTypes); + return org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil.getConstructorCandidates(lType, argTypes, context).length == 1; } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java index d1981723e78c..628b7350ce25 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java @@ -66,6 +66,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.types.GrClosureSignature; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement; import org.jetbrains.plugins.groovy.lang.psi.impl.GrClosureType; import org.jetbrains.plugins.groovy.lang.psi.impl.GrMapType; +import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyResolveResultImpl; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass; import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.JavaIdentifier; @@ -939,4 +940,18 @@ public class PsiUtil { } return (GrReferenceExpression)replaced; } + + public static GroovyResolveResult[] getConstructorCandidates(PsiClassType classType, PsiType[] argTypes, GroovyPsiElement context) { + final PsiClassType.ClassResolveResult resolveResult = classType.resolveGenerics(); + final PsiClass psiClass = resolveResult.getElement(); + final PsiSubstitutor substitutor = resolveResult.getSubstitutor(); + if (psiClass == null) { + return GroovyResolveResult.EMPTY_ARRAY; + } + + final GroovyResolveResult grResult = resolveResult instanceof GroovyResolveResult + ? (GroovyResolveResult)resolveResult + : new GroovyResolveResultImpl(psiClass, context, substitutor, true, true); + return getConstructorCandidates(context, new GroovyResolveResult[]{grResult}, argTypes); + } } From 48c4b185cd4307d4c4565bd9934c688d18ec6192 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 26 Jul 2010 20:29:53 +0100 Subject: [PATCH 53/82] then- and else branches of groovy if may return a value from function: support this in control flow (IDEA-56628) --- .../GroovyAssignabilityCheckInspection.java | 9 ++++--- .../MissingReturnInspection.java | 7 +++-- .../utils/ControlFlowUtils.java | 13 ++++++--- .../controlFlow/impl/ControlFlowBuilder.java | 17 +++++++----- .../testdata/groovy/controlFlow/if1.test | 5 ++-- .../groovy/controlFlow/ifInstanceofElse.test | 27 ++++++++++--------- 6 files changed, 48 insertions(+), 30 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GroovyAssignabilityCheckInspection.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GroovyAssignabilityCheckInspection.java index 44b23e2aae38..f2be2a783d20 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GroovyAssignabilityCheckInspection.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GroovyAssignabilityCheckInspection.java @@ -21,6 +21,7 @@ import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.TypeConversionUtil; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.GroovyBundle; import org.jetbrains.plugins.groovy.codeInspection.BaseInspection; import org.jetbrains.plugins.groovy.codeInspection.BaseInspectionVisitor; @@ -94,10 +95,10 @@ public class GroovyAssignabilityCheckInspection extends BaseInspection { if (expectedType == null || PsiType.VOID.equals(expectedType)) return; ControlFlowUtils.visitAllExitPoints(block, new ControlFlowUtils.ExitPointVisitor() { - public boolean visit(Instruction instruction) { - final PsiElement psiElement = instruction.getElement(); - if (psiElement instanceof GrExpression) { - checkAssignability(expectedType, (GrExpression)psiElement, (GrExpression)psiElement); + @Override + public boolean visitExitPoint(Instruction instruction, @Nullable GrExpression returnValue) { + if (returnValue != null && !(returnValue.getParent() instanceof GrReturnStatement)) { + checkAssignability(expectedType, returnValue, returnValue); } return true; } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/noReturnMethod/MissingReturnInspection.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/noReturnMethod/MissingReturnInspection.java index 684dbfe780ac..a39ba6cc3fee 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/noReturnMethod/MissingReturnInspection.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/noReturnMethod/MissingReturnInspection.java @@ -24,6 +24,7 @@ import com.intellij.psi.PsiType; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.codeInspection.GroovyInspectionBundle; import org.jetbrains.plugins.groovy.codeInspection.GroovySuppressableInspectionTool; import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils; @@ -35,6 +36,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrOpenBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.branch.GrAssertStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.branch.GrReturnStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.branch.GrThrowStatement; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; import org.jetbrains.plugins.groovy.lang.psi.controlFlow.Instruction; import org.jetbrains.plugins.groovy.lang.psi.controlFlow.impl.MaybeReturnInstruction; @@ -86,7 +88,8 @@ public class MissingReturnInspection extends GroovySuppressableInspectionTool { final Ref hasExplicitReturn = new Ref(false); final Ref sometimes = new Ref(false); ControlFlowUtils.visitAllExitPoints(block, new ControlFlowUtils.ExitPointVisitor() { - public boolean visit(Instruction instruction) { + @Override + public boolean visitExitPoint(Instruction instruction, @Nullable GrExpression returnValue) { if (instruction instanceof MaybeReturnInstruction) { if (((MaybeReturnInstruction)instruction).mayReturnValue()) { sometimes.set(true); @@ -99,7 +102,7 @@ public class MissingReturnInspection extends GroovySuppressableInspectionTool { final PsiElement element = instruction.getElement(); if (element instanceof GrReturnStatement) { sometimes.set(true); - if (((GrReturnStatement)element).getReturnValue() != null) { + if (returnValue != null) { hasExplicitReturn.set(true); } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/utils/ControlFlowUtils.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/utils/ControlFlowUtils.java index 86aa6c0503e4..995b0302494d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/utils/ControlFlowUtils.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/utils/ControlFlowUtils.java @@ -543,7 +543,7 @@ public class ControlFlowUtils { public interface ExitPointVisitor { - boolean visit(Instruction instruction); + boolean visitExitPoint(Instruction instruction, @Nullable GrExpression returnValue); } public static void visitAllExitPoints(@Nullable GrCodeBlock block, ExitPointVisitor visitor) { @@ -556,12 +556,16 @@ public class ControlFlowUtils { private static boolean visitAllExitPointsInner(Instruction last, Instruction first, boolean[] visited, ExitPointVisitor visitor) { if (first == last) return true; if (last instanceof MaybeReturnInstruction) { - return visitor.visit(last); + return visitor.visitExitPoint(last, (GrExpression)last.getElement()); } - final PsiElement element = last.getElement(); + PsiElement element = last.getElement(); if (element != null) { - return visitor.visit(last); + if (element instanceof GrReturnStatement) { + element = ((GrReturnStatement)element).getReturnValue(); + } + + return visitor.visitExitPoint(last, element instanceof GrExpression ? (GrExpression)element : null); } visited[last.num()] = true; for (Instruction pred : last.allPred()) { @@ -571,4 +575,5 @@ public class ControlFlowUtils { } return true; } + } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/impl/ControlFlowBuilder.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/impl/ControlFlowBuilder.java index ea85bc7a40b1..174ac80aa94e 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/impl/ControlFlowBuilder.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/impl/ControlFlowBuilder.java @@ -107,16 +107,19 @@ public class ControlFlowBuilder extends GroovyRecursiveElementVisitor { if (!(block.getParent() instanceof GrBlockStatement && block.getParent().getParent() instanceof GrLoopStatement)) { final GrStatement[] statements = block.getStatements(); if (statements.length > 0) { - final GrStatement last = statements[statements.length - 1]; - if (last instanceof GrExpression) { - final MaybeReturnInstruction instruction = new MaybeReturnInstruction((GrExpression)last, myInstructionNumber++); - checkPending(instruction); - addNode(instruction); - } + handlePossibleReturn(statements[statements.length - 1]); } } } + private void handlePossibleReturn(GrStatement last) { + if (last instanceof GrExpression) { + final MaybeReturnInstruction instruction = new MaybeReturnInstruction((GrExpression)last, myInstructionNumber++); + checkPending(instruction); + addNode(instruction); + } + } + public Instruction[] buildControlFlow(GroovyPsiElement scope, GroovyPsiElement startInScope, GroovyPsiElement endInScope) { myInstructions = new ArrayList(); myProcessingStack = new Stack(); @@ -386,6 +389,7 @@ public class ControlFlowBuilder extends GroovyRecursiveElementVisitor { condition.accept(this); } thenBranch.accept(this); + handlePossibleReturn(thenBranch); addPendingEdge(ifStatement, myHead); } @@ -402,6 +406,7 @@ public class ControlFlowBuilder extends GroovyRecursiveElementVisitor { final GrStatement elseBranch = ifStatement.getElseBranch(); if (elseBranch != null) { elseBranch.accept(this); + handlePossibleReturn(elseBranch); addPendingEdge(ifStatement, myHead); } diff --git a/plugins/groovy/testdata/groovy/controlFlow/if1.test b/plugins/groovy/testdata/groovy/controlFlow/if1.test index a88e8969eb44..f4dc6626de6c 100644 --- a/plugins/groovy/testdata/groovy/controlFlow/if1.test +++ b/plugins/groovy/testdata/groovy/controlFlow/if1.test @@ -7,6 +7,7 @@ if (true) { 0(1) element: null 1(2,4) element: IF statement 2(3) WRITE a -3(5) element: Assignment expression MAYBE_RETURN +3(6) element: Assignment expression MAYBE_RETURN 4(5) WRITE a -5() element: null \ No newline at end of file +5(6) element: Assignment expression MAYBE_RETURN +6() element: null \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/controlFlow/ifInstanceofElse.test b/plugins/groovy/testdata/groovy/controlFlow/ifInstanceofElse.test index 7851696d58a6..e1f89d70302f 100644 --- a/plugins/groovy/testdata/groovy/controlFlow/ifInstanceofElse.test +++ b/plugins/groovy/testdata/groovy/controlFlow/ifInstanceofElse.test @@ -3,17 +3,20 @@ else if (!(o instanceof Integer)) b = 2 else b = 3 ----- 0(1) element: null -1(2,5) element: IF statement +1(2,6) element: IF statement 2(3) READ o 3(4) assertion: o instanceof String -4(14) WRITE b -5(6) READ o -6(7) assertion: ! o instanceof String -7(8,11) element: IF statement -8(9) READ o -9(10) assertion: ! o instanceof Integer -10(14) WRITE b -11(12) READ o -12(13) assertion: o instanceof Integer -13(14) WRITE b -14() element: null \ No newline at end of file +4(5) WRITE b +5(17) element: Assignment expression MAYBE_RETURN +6(7) READ o +7(8) assertion: ! o instanceof String +8(9,13) element: IF statement +9(10) READ o +10(11) assertion: ! o instanceof Integer +11(12) WRITE b +12(17) element: Assignment expression MAYBE_RETURN +13(14) READ o +14(15) assertion: o instanceof Integer +15(16) WRITE b +16(17) element: Assignment expression MAYBE_RETURN +17() element: null \ No newline at end of file From 68d4b5d86cc1ffafe83cc1f1401a9dc23f25c510 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 26 Jul 2010 20:30:17 +0100 Subject: [PATCH 54/82] PsiReferenceBase.createSelfReference(PsiElement, PsiElement, TextRange) --- .../com/intellij/psi/PsiReferenceBase.java | 59 ++++++++++++++----- 1 file changed, 43 insertions(+), 16 deletions(-) diff --git a/platform/lang-api/src/com/intellij/psi/PsiReferenceBase.java b/platform/lang-api/src/com/intellij/psi/PsiReferenceBase.java index 4e527134996f..a2840604b3c3 100644 --- a/platform/lang-api/src/com/intellij/psi/PsiReferenceBase.java +++ b/platform/lang-api/src/com/intellij/psi/PsiReferenceBase.java @@ -107,23 +107,11 @@ public abstract class PsiReferenceBase implements PsiRefer } public static PsiReferenceBase createSelfReference(T element, final PsiElement resolveTo) { + return new Immediate(element, true, resolveTo); + } - return new PsiReferenceBase(element,true) { - //do nothing. the element will be renamed via PsiMetaData (com.intellij.refactoring.rename.RenameUtil.doRenameGenericNamedElement()) - public PsiElement handleElementRename(final String newElementName) throws IncorrectOperationException { - return getElement(); - } - - @Nullable - public PsiElement resolve() { - return resolveTo; - } - - @NotNull - public Object[] getVariants() { - return EMPTY_ARRAY; - } - }; + public static PsiReferenceBase createSelfReference(T element, TextRange range, final PsiElement resolveTo) { + return new Immediate(element, range, resolveTo); } @Nullable @@ -165,4 +153,43 @@ public abstract class PsiReferenceBase implements PsiRefer return resolveResults.length == 1 ? resolveResults[0].getElement() : null; } } + + public static class Immediate extends PsiReferenceBase { + private final PsiElement myResolveTo; + + public Immediate(T element, TextRange range, boolean soft, PsiElement resolveTo) { + super(element, range, soft); + myResolveTo = resolveTo; + } + + public Immediate(T element, TextRange range, PsiElement resolveTo) { + super(element, range); + myResolveTo = resolveTo; + } + + public Immediate(T element, boolean soft, PsiElement resolveTo) { + super(element, soft); + myResolveTo = resolveTo; + } + + public Immediate(@NotNull T element, PsiElement resolveTo) { + super(element); + myResolveTo = resolveTo; + } + + //do nothing. the element will be renamed via PsiMetaData (com.intellij.refactoring.rename.RenameUtil.doRenameGenericNamedElement()) + public PsiElement handleElementRename(final String newElementName) throws IncorrectOperationException { + return getElement(); + } + + @Nullable + public PsiElement resolve() { + return myResolveTo; + } + + @NotNull + public Object[] getVariants() { + return EMPTY_ARRAY; + } + } } From 5f49355390c39c5acefc311e4e2b56f579d8e0f1 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 26 Jul 2010 20:31:05 +0100 Subject: [PATCH 55/82] find Groovy list2object conversions as constructor usages --- .../GroovyConstructorUsagesSearchHelper.java | 110 +++++++++++++++--- .../lang/LiteralConstructorUsagesTest.groovy | 47 ++++++++ 2 files changed, 140 insertions(+), 17 deletions(-) create mode 100644 plugins/groovy/test/org/jetbrains/plugins/groovy/lang/LiteralConstructorUsagesTest.groovy diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java index d3ea103a2b8e..9a46dcfc2899 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java @@ -28,18 +28,30 @@ import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.searches.DirectClassInheritorsSearch; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.util.Processor; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.GroovyFileType; +import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; +import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrConstructorInvocation; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrOpenBlock; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrNewExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrSafeCastExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrTypeCastExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrAnonymousClassDefinition; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstant; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement; +import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeElement; +import org.jetbrains.plugins.groovy.lang.psi.controlFlow.Instruction; +import org.jetbrains.plugins.groovy.lang.psi.impl.GrTupleType; +import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; /** * @author Maxim.Medvedev @@ -88,22 +100,7 @@ public class GroovyConstructorUsagesSearchHelper { ReferencesSearch.search(clazz, searchScope, true).forEach(new ReadActionProcessor() { @Override public boolean processInReadAction(PsiReference ref) { - final PsiElement element = ref.getElement(); - if (element instanceof GrCodeReferenceElement) { - GrNewExpression newExpression = null; - if (element.getParent() instanceof GrNewExpression) { - newExpression = (GrNewExpression)element.getParent(); - } - else if (element.getParent() instanceof GrAnonymousClassDefinition) { - newExpression = (GrNewExpression)element.getParent().getParent(); - } - if (newExpression != null) { - final PsiMethod resolvedConstructor = newExpression.resolveConstructor(); - final PsiManager manager = constructor.getManager(); - if (manager.areElementsEquivalent(resolvedConstructor, constructor) && !consumer.process(ref)) return false; - } - } - return true; + return processClassReference(ref, constructor, consumer); } }); @@ -128,6 +125,85 @@ public class GroovyConstructorUsagesSearchHelper { return true; } + private static boolean processClassReference(PsiReference ref, final PsiMethod constructor, final Processor consumer) { + final PsiElement element = ref.getElement(); + if (!(element instanceof GrCodeReferenceElement)) { + return true; + } + + final PsiElement parent = element.getParent(); + if (parent instanceof GrNewExpression) { + final PsiMethod resolvedConstructor = ((GrNewExpression)parent).resolveConstructor(); + if (constructor.getManager().areElementsEquivalent(resolvedConstructor, constructor) && !consumer.process(ref)) { + return false; + } + } + else if (parent instanceof GrTypeElement) { + final GrTypeElement typeElement = (GrTypeElement)parent; + + final PsiElement grandpa = typeElement.getParent(); + if (grandpa instanceof GrVariableDeclaration) { + final GrVariable[] vars = ((GrVariableDeclaration)grandpa).getVariables(); + if (vars.length == 1) { + final GrVariable variable = vars[0]; + if (!checkListInstantiation(constructor, consumer, variable.getInitializerGroovy(), typeElement)) { + return false; + } + } + } + else if (grandpa instanceof GrMethod) { + final GrMethod method = (GrMethod)grandpa; + if (typeElement == method.getReturnTypeElementGroovy()) { + ControlFlowUtils.visitAllExitPoints(method.getBlock(), new ControlFlowUtils.ExitPointVisitor() { + @Override + public boolean visitExitPoint(Instruction instruction, @Nullable GrExpression returnValue) { + if (!checkListInstantiation(constructor, consumer, returnValue, typeElement)) { + return false; + } + return true; + } + }); + } + } + else if (grandpa instanceof GrTypeCastExpression) { + final GrTypeCastExpression cast = (GrTypeCastExpression)grandpa; + if (cast.getCastTypeElement() == typeElement && !checkListInstantiation(constructor, consumer, cast.getOperand(), typeElement)) { + return false; + } + } + else if (grandpa instanceof GrSafeCastExpression) { + final GrSafeCastExpression cast = (GrSafeCastExpression)grandpa; + if (cast.getCastTypeElement() == typeElement && !checkListInstantiation(constructor, consumer, cast.getOperand(), typeElement)) { + return false; + } + } + } + return true; + } + + private static boolean checkListInstantiation(PsiMethod constructor, + Processor consumer, + GrExpression expression, final GrTypeElement typeElement) { + if (expression instanceof GrListOrMap) { + final GrListOrMap list = (GrListOrMap)expression; + if (!list.isMap()) { + final PsiType expectedType = typeElement.getType(); + final PsiType listType = list.getType(); + if (listType instanceof GrTupleType && expectedType instanceof PsiClassType) { + final GroovyResolveResult[] candidates = PsiUtil.getConstructorCandidates((PsiClassType)expectedType, ((GrTupleType)listType).getComponentTypes(), list); + for (GroovyResolveResult candidate : candidates) { + if (constructor.getManager().areElementsEquivalent(candidate.getElement(), constructor)) { + if (!consumer.process(PsiReferenceBase.createSelfReference(list, TextRange.from(0, list.getTextLength()), constructor))) { + return false; + } + } + } + } + } + } + return true; + } + private static boolean processConstructors(final PsiMethod constructor, final Processor consumer, final PsiClass clazz, final boolean processThisRefs) { return ApplicationManager.getApplication().runReadAction(new Computable() { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/LiteralConstructorUsagesTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/LiteralConstructorUsagesTest.groovy new file mode 100644 index 000000000000..f6e6df14f708 --- /dev/null +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/LiteralConstructorUsagesTest.groovy @@ -0,0 +1,47 @@ +package org.jetbrains.plugins.groovy.lang + +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase +import com.intellij.psi.search.searches.ReferencesSearch + +/** + * @author peter + */ +class LiteralConstructorUsagesTest extends LightCodeInsightFixtureTestCase { + + public void testListVariable() throws Exception { + def foo = myFixture.addClass("""class Foo { + Foo() {} + } +""") + myFixture.addFileToProject "a.groovy", "Foo x = []" + assertOneElement(ReferencesSearch.search(foo.constructors[0]).findAll()) + } + + public void testListReturnValue() throws Exception { + def foo = myFixture.addClass("""class Foo { + Foo() {} + } +""") + myFixture.addFileToProject "a.groovy", "Foo foo() { if (true) [] else return [] }" + assertEquals(2, ReferencesSearch.search(foo.constructors[0]).findAll().size()) + } + + public void testListCast() throws Exception { + def foo = myFixture.addClass("""class Foo { + Foo() {} + } +""") + myFixture.addFileToProject "a.groovy", "def x = (Foo) []" + assertOneElement(ReferencesSearch.search(foo.constructors[0]).findAll()) + } + + public void testListAsCast() throws Exception { + def foo = myFixture.addClass("""class Foo { + Foo() {} + } +""") + myFixture.addFileToProject "a.groovy", "def x = [] as Foo" + assertOneElement(ReferencesSearch.search(foo.constructors[0]).findAll()) + } + +} From 61e2575c872fb4d10b1d317a3f437dfd32f94581 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 26 Jul 2010 23:17:13 +0100 Subject: [PATCH 56/82] index groovy package annotations --- .../findUsages/AnnotatedMembersSearcher.java | 56 ++++++++++----- .../packaging/GrPackageDefinition.java | 10 ++- .../impl/GroovyDirectInheritorsSearcher.java | 35 +++++++++- .../packaging/GrPackageDefinitionImpl.java | 14 ++++ .../groovy/lang/psi/stubs/GrFileStub.java | 56 +++++++++++++-- .../groovy/lang/psi/stubs/GrStubUtils.java | 18 ++++- .../lang/psi/stubs/GroovyFileStubBuilder.java | 3 +- .../stubs/elements/GrFieldElementType.java | 23 +----- .../stubs/elements/GrMethodElementType.java | 40 +++-------- .../stubs/elements/GrStubFileElementType.java | 12 +++- .../elements/GrTypeDefinitionElementType.java | 3 +- .../lang/psi/stubs/impl/GrFileStubImpl.java | 63 ----------------- .../stubs/index/GrAnnotatedMemberIndex.java | 8 +-- .../groovy/lang/stubs/GroovyCacheUtil.java | 70 ------------------- 14 files changed, 182 insertions(+), 229 deletions(-) delete mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/impl/GrFileStubImpl.java delete mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/lang/stubs/GroovyCacheUtil.java diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/AnnotatedMembersSearcher.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/AnnotatedMembersSearcher.java index 3a4b9ecfc1d0..ead9e3f235d3 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/AnnotatedMembersSearcher.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/AnnotatedMembersSearcher.java @@ -21,25 +21,49 @@ 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.stubs.StubIndex; import com.intellij.util.Processor; import com.intellij.util.QueryExecutor; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.GroovyRecursiveElementVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMember; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; -import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass; -import org.jetbrains.plugins.groovy.lang.stubs.GroovyCacheUtil; +import org.jetbrains.plugins.groovy.lang.psi.stubs.index.GrAnnotatedMemberIndex; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.List; /** * @author ven */ -public class AnnotatedMembersSearcher implements QueryExecutor { +public class AnnotatedMembersSearcher implements QueryExecutor { - public boolean execute(final AnnotatedElementsSearch.Parameters p, final Processor consumer) { + @NotNull + private static List getAnnotatedMemberCandidates(PsiClass clazz, GlobalSearchScope scope) { + final String name = clazz.getName(); + if (name == null) return Collections.emptyList(); + final Collection members = StubIndex.getInstance().get(GrAnnotatedMemberIndex.KEY, name, clazz.getProject(), scope); + if (members.isEmpty()) { + return Collections.emptyList(); + } + + final ArrayList result = new ArrayList(); + for (PsiElement element : members) { + if (element instanceof GroovyFile) { + element = ((GroovyFile)element).getPackageDefinition(); + } + if (element instanceof PsiModifierListOwner) { + result.add((PsiModifierListOwner)element); + } + } + return result; + } + + public boolean execute(final AnnotatedElementsSearch.Parameters p, final Processor consumer) { final PsiClass annClass = p.getAnnotationClass(); assert annClass.isAnnotationType() : "Annotation type should be passed to annotated members search"; @@ -48,29 +72,27 @@ public class AnnotatedMembersSearcher implements QueryExecutor candidates; if (scope instanceof GlobalSearchScope) { - candidates = GroovyCacheUtil.getAnnotatedMemberCandidates(annClass, ((GlobalSearchScope)scope)); + candidates = getAnnotatedMemberCandidates(annClass, ((GlobalSearchScope)scope)); } else { - PsiElement[] elements = ((LocalSearchScope)scope).getScope(); - final List collector = new ArrayList(); - for (PsiElement element : elements) { + candidates = new ArrayList(); + for (PsiElement element : ((LocalSearchScope)scope).getScope()) { if (element instanceof GroovyPsiElement) { ((GroovyPsiElement)element).accept(new GroovyRecursiveElementVisitor() { public void visitMethod(GrMethod method) { - collector.add(method); + candidates.add(method); } public void visitField(GrField field) { - collector.add(field); + candidates.add(field); } }); } } - candidates = collector.toArray(new PsiMember[collector.size()]); } - for (PsiMember candidate : candidates) { + for (PsiModifierListOwner candidate : candidates) { if (!AnnotatedElementsSearcher.isInstanceof(candidate, p.getTypes())) { continue; } @@ -78,10 +100,8 @@ public class AnnotatedMembersSearcher implements QueryExecutor inheritors = new ArrayList(); + final Collection refLists = StubIndex.getInstance().get(GrDirectInheritorsIndex.KEY, name, clazz.getProject(), scope); + for (GrReferenceList list : refLists) { + final PsiElement parent = list.getParent(); + if (parent instanceof GrTypeDefinition) { + inheritors.add(GrClassSubstitutor.getSubstitutedClass(((GrTypeDefinition)parent))); + } + } + final Collection classes = + StubIndex.getInstance().get(GrAnonymousClassIndex.KEY, name, clazz.getProject(), scope); + for (GrAnonymousClassDefinition aClass : classes) { + inheritors.add(aClass); + } + return inheritors.toArray(new PsiClass[inheritors.size()]); + } + public boolean execute(DirectClassInheritorsSearch.SearchParameters queryParameters, final Processor consumer) { final PsiClass clazz = queryParameters.getClassToProcess(); final SearchScope scope = queryParameters.getScope(); @@ -39,7 +70,7 @@ class GroovyDirectInheritorsSearcher implements QueryExecutor() { public PsiClass[] compute() { if (!clazz.isValid()) return PsiClass.EMPTY_ARRAY; - return GroovyCacheUtil.getDeriverCandidates(clazz, (GlobalSearchScope)scope); + return getDeriverCandidates(clazz, (GlobalSearchScope)scope); } }); for (final PsiClass candidate : candidates) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/toplevel/packaging/GrPackageDefinitionImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/toplevel/packaging/GrPackageDefinitionImpl.java index 55acc71f0f34..3041aa24363c 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/toplevel/packaging/GrPackageDefinitionImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/toplevel/packaging/GrPackageDefinitionImpl.java @@ -17,6 +17,9 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.toplevel.packaging; import com.intellij.lang.ASTNode; +import com.intellij.psi.Modifier; +import com.intellij.psi.PsiModifierList; +import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; @@ -56,4 +59,15 @@ public class GrPackageDefinitionImpl extends GroovyPsiElementImpl implements GrP public GrModifierList getAnnotationList() { return (GrModifierList)findChildByType(GroovyElementTypes.MODIFIERS); } + + @Override + public PsiModifierList getModifierList() { + return getAnnotationList(); + } + + @Override + public boolean hasModifierProperty(@Modifier @NonNls @NotNull String name) { + final PsiModifierList list = getModifierList(); + return list != null && list.hasExplicitModifier(name); + } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrFileStub.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrFileStub.java index 0cf2e750f5aa..454c280d7bdc 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrFileStub.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrFileStub.java @@ -15,17 +15,63 @@ */ package org.jetbrains.plugins.groovy.lang.psi.stubs; -import com.intellij.psi.stubs.PsiFileStub; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.stubs.PsiFileStubImpl; +import com.intellij.psi.tree.IStubFileElementType; +import com.intellij.util.ArrayUtil; import com.intellij.util.io.StringRef; +import org.jetbrains.plugins.groovy.lang.parser.GroovyParserDefinition; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; +import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.packaging.GrPackageDefinition; +import org.jetbrains.plugins.groovy.lang.psi.stubs.elements.GrTypeDefinitionElementType; /** * @author ilyas */ -public interface GrFileStub extends PsiFileStub { - StringRef getPackageName(); +public class GrFileStub extends PsiFileStubImpl { + private final String[] myAnnotations; + private final StringRef myPackageName; + private final StringRef myName; + private final boolean isScript; - StringRef getName(); + public GrFileStub(GroovyFile file) { + super(file); + myPackageName = StringRef.fromString(file.getPackageName()); + myName = StringRef.fromString(StringUtil.trimEnd(file.getName(), ".groovy")); + isScript = file.isScript(); + final GrPackageDefinition definition = file.getPackageDefinition(); + if (definition != null) { + myAnnotations = GrTypeDefinitionElementType.getAnnotationNames(definition); + } else { + myAnnotations = ArrayUtil.EMPTY_STRING_ARRAY; + } + } - boolean isScript(); + public GrFileStub(StringRef packName, StringRef name, boolean isScript, String[] annotations) { + super(null); + myPackageName = packName; + myName = name; + this.isScript = isScript; + myAnnotations = annotations; + } + + public IStubFileElementType getType() { + return GroovyParserDefinition.GROOVY_FILE; + } + + public StringRef getPackageName() { + return myPackageName; + } + + public StringRef getName() { + return myName; + } + + public boolean isScript() { + return isScript; + } + + public String[] getAnnotations() { + return myAnnotations; + } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrStubUtils.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrStubUtils.java index 7a5d0c4fb816..9ecbce673657 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrStubUtils.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrStubUtils.java @@ -58,5 +58,21 @@ public class GrStubUtils { dataStream.writeUTF(namepParameter); } } - } + } + + public static void writeStringArray(StubOutputStream dataStream, String[] array) throws IOException { + dataStream.writeByte(array.length); + for (String s : array) { + dataStream.writeName(s); + } + } + + public static String[] readStringArray(StubInputStream dataStream) throws IOException { + final byte b = dataStream.readByte(); + final String[] annNames = new String[b]; + for (int i = 0; i < b; i++) { + annNames[i] = dataStream.readName().toString(); + } + return annNames; + } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GroovyFileStubBuilder.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GroovyFileStubBuilder.java index 902f4b0cef96..53aa5f33101a 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GroovyFileStubBuilder.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GroovyFileStubBuilder.java @@ -19,7 +19,6 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.stubs.DefaultStubBuilder; import com.intellij.psi.stubs.StubElement; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; -import org.jetbrains.plugins.groovy.lang.psi.stubs.impl.GrFileStubImpl; /** * @author ilyas @@ -27,7 +26,7 @@ import org.jetbrains.plugins.groovy.lang.psi.stubs.impl.GrFileStubImpl; public class GroovyFileStubBuilder extends DefaultStubBuilder { protected StubElement createStubForFile(final PsiFile file) { if (file instanceof GroovyFile && ((GroovyFile) file).isScript()) { - return new GrFileStubImpl((GroovyFile)file); + return new GrFileStub((GroovyFile)file); } return super.createStubForFile(file); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrFieldElementType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrFieldElementType.java index b909c710c179..1fe39965b9f0 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrFieldElementType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrFieldElementType.java @@ -21,16 +21,10 @@ import com.intellij.psi.stubs.IndexSink; import com.intellij.psi.stubs.StubElement; import com.intellij.psi.stubs.StubInputStream; import com.intellij.psi.stubs.StubOutputStream; -import com.intellij.util.ArrayUtil; -import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.io.StringRef; -import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GrStubElementType; -import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; -import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotation; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; -import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.GrFieldImpl; import org.jetbrains.plugins.groovy.lang.psi.stubs.GrFieldStub; import org.jetbrains.plugins.groovy.lang.psi.stubs.impl.GrFieldStubImpl; @@ -64,22 +58,7 @@ public class GrFieldElementType extends GrStubElementType } public GrFieldStub createStub(GrField psi, StubElement parentStub) { - final GrModifierList modifiers = psi.getModifierList(); - String[] annNames; - if (modifiers == null) { - annNames = ArrayUtil.EMPTY_STRING_ARRAY; - } - else { - final GrAnnotation[] annotations = modifiers.getAnnotations(); - annNames = ContainerUtil.map(annotations, new Function() { - @Nullable - public String fun(final GrAnnotation grAnnotation) { - final GrCodeReferenceElement element = grAnnotation.getClassReference(); - if (element == null) return null; - return element.getReferenceName(); - } - }, new String[annotations.length]); - } + String[] annNames = GrTypeDefinitionElementType.getAnnotationNames(psi); Set[] namedParametersArray = new Set[0]; if (psi instanceof GrFieldImpl){ diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrMethodElementType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrMethodElementType.java index 94504b059250..c242f4fe2245 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrMethodElementType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrMethodElementType.java @@ -20,15 +20,9 @@ import com.intellij.psi.stubs.IndexSink; import com.intellij.psi.stubs.StubElement; import com.intellij.psi.stubs.StubInputStream; import com.intellij.psi.stubs.StubOutputStream; -import com.intellij.util.Function; -import com.intellij.util.containers.ContainerUtil; import com.intellij.util.io.StringRef; -import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GrStubElementType; -import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; -import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotation; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; -import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.typedef.members.GrMethodImpl; import org.jetbrains.plugins.groovy.lang.psi.stubs.GrMethodStub; import org.jetbrains.plugins.groovy.lang.psi.stubs.GrStubUtils; @@ -37,7 +31,9 @@ import org.jetbrains.plugins.groovy.lang.psi.stubs.index.GrAnnotatedMemberIndex; import org.jetbrains.plugins.groovy.lang.psi.stubs.index.GrMethodNameIndex; import java.io.IOException; -import java.util.*; +import java.util.HashSet; +import java.util.List; +import java.util.Set; /** * @author ilyas @@ -57,42 +53,22 @@ public class GrMethodElementType extends GrStubElementType() { - @Nullable - public String fun(final GrAnnotation grAnnotation) { - final GrCodeReferenceElement element = grAnnotation.getClassReference(); - if (element == null) return null; - return element.getReferenceName(); - } - }, new String[annotations.length]); - Set[] namedParametersArray; - namedParametersArray = psi.getNamedParametersArray(); - - return new GrMethodStubImpl(parentStub, StringRef.fromString(psi.getName()), annNames, namedParametersArray); + return new GrMethodStubImpl(parentStub, StringRef.fromString(psi.getName()), GrTypeDefinitionElementType.getAnnotationNames(psi), + psi.getNamedParametersArray()); } public void serialize(GrMethodStub stub, StubOutputStream dataStream) throws IOException { dataStream.writeName(stub.getName()); - final String[] annotations = stub.getAnnotations(); - dataStream.writeByte(annotations.length); - for (String s : annotations) { - dataStream.writeName(s); - } + GrStubUtils.writeStringArray(dataStream, stub.getAnnotations()); final Set[] namedParameters = stub.getNamedParameters(); GrStubUtils.serializeCollectionsArray(dataStream, namedParameters); } - + public GrMethodStub deserialize(StubInputStream dataStream, StubElement parentStub) throws IOException { StringRef ref = dataStream.readName(); - final byte b = dataStream.readByte(); - final String[] annNames = new String[b]; - for (int i = 0; i < b; i++) { - annNames[i] = dataStream.readName().toString(); - } + final String[] annNames = GrStubUtils.readStringArray(dataStream); final List> namedParametersSets = GrStubUtils.deserializeCollectionsArray(dataStream); return new GrMethodStubImpl(parentStub, ref, annNames, namedParametersSets.toArray(new HashSet[0])); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrStubFileElementType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrStubFileElementType.java index 70a7da0e41a1..3dd1dec6fc2e 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrStubFileElementType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrStubFileElementType.java @@ -21,8 +21,9 @@ import com.intellij.psi.stubs.*; import com.intellij.psi.tree.IStubFileElementType; import com.intellij.util.io.StringRef; import org.jetbrains.plugins.groovy.lang.psi.stubs.GrFileStub; +import org.jetbrains.plugins.groovy.lang.psi.stubs.GrStubUtils; import org.jetbrains.plugins.groovy.lang.psi.stubs.GroovyFileStubBuilder; -import org.jetbrains.plugins.groovy.lang.psi.stubs.impl.GrFileStubImpl; +import org.jetbrains.plugins.groovy.lang.psi.stubs.index.GrAnnotatedMemberIndex; import org.jetbrains.plugins.groovy.lang.psi.stubs.index.GrFullScriptNameIndex; import org.jetbrains.plugins.groovy.lang.psi.stubs.index.GrScriptClassNameIndex; @@ -43,7 +44,7 @@ public class GrStubFileElementType extends IStubFileElementType { @Override public int getStubVersion() { - return super.getStubVersion() + 5; + return super.getStubVersion() + 6; } public String getExternalId() { @@ -60,6 +61,7 @@ public class GrStubFileElementType extends IStubFileElementType { dataStream.writeName(stub.getPackageName().toString()); dataStream.writeName(stub.getName().toString()); dataStream.writeBoolean(stub.isScript()); + GrStubUtils.writeStringArray(dataStream, stub.getAnnotations()); } @Override @@ -67,7 +69,7 @@ public class GrStubFileElementType extends IStubFileElementType { StringRef packName = dataStream.readName(); StringRef name = dataStream.readName(); boolean isScript = dataStream.readBoolean(); - return new GrFileStubImpl(packName, name, isScript); + return new GrFileStub(packName, name, isScript, GrStubUtils.readStringArray(dataStream)); } public void indexStub(GrFileStub stub, IndexSink sink) { @@ -78,6 +80,10 @@ public class GrStubFileElementType extends IStubFileElementType { final String fqn = pName == null || pName.length() == 0 ? name : pName + "." + name; sink.occurrence(GrFullScriptNameIndex.KEY, fqn.hashCode()); } + + for (String anno : stub.getAnnotations()) { + sink.occurrence(GrAnnotatedMemberIndex.KEY, anno); + } } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrTypeDefinitionElementType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrTypeDefinitionElementType.java index 5cb77de6737b..3caa45dfa5f4 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrTypeDefinitionElementType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrTypeDefinitionElementType.java @@ -17,6 +17,7 @@ package org.jetbrains.plugins.groovy.lang.psi.stubs.elements; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiModifierList; +import com.intellij.psi.PsiModifierListOwner; import com.intellij.psi.PsiNameHelper; import com.intellij.psi.impl.java.stubs.index.JavaFullClassNameIndex; import com.intellij.psi.impl.java.stubs.index.JavaShortClassNameIndex; @@ -59,7 +60,7 @@ public abstract class GrTypeDefinitionElementType annoNames = CollectionFactory.arrayList(); final PsiModifierList modifierList = psi.getModifierList(); if (modifierList instanceof GrModifierList) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/impl/GrFileStubImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/impl/GrFileStubImpl.java deleted file mode 100644 index 6a810c1247ec..000000000000 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/impl/GrFileStubImpl.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2000-2009 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.groovy.lang.psi.stubs.impl; - -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.stubs.PsiFileStubImpl; -import com.intellij.psi.tree.IStubFileElementType; -import com.intellij.util.io.StringRef; -import org.jetbrains.plugins.groovy.lang.parser.GroovyParserDefinition; -import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; -import org.jetbrains.plugins.groovy.lang.psi.stubs.GrFileStub; - -/** - * @author ilyas - */ -public class GrFileStubImpl extends PsiFileStubImpl implements GrFileStub { - private final StringRef myPackageName; - private final StringRef myName; - private final boolean isScript; - - public GrFileStubImpl(GroovyFile file) { - super(file); - myPackageName = StringRef.fromString(file.getPackageName()); - myName = StringRef.fromString(StringUtil.trimEnd(file.getName(), ".groovy")); - isScript = file.isScript(); - } - - public GrFileStubImpl(StringRef packName, StringRef name, boolean isScript) { - super(null); - myPackageName = packName; - myName = name; - this.isScript = isScript; - } - - public IStubFileElementType getType() { - return GroovyParserDefinition.GROOVY_FILE; - } - - public StringRef getPackageName() { - return myPackageName; - } - - public StringRef getName() { - return myName; - } - - public boolean isScript() { - return isScript; - } -} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/index/GrAnnotatedMemberIndex.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/index/GrAnnotatedMemberIndex.java index 1b8a5368bd1f..ec2e377773aa 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/index/GrAnnotatedMemberIndex.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/index/GrAnnotatedMemberIndex.java @@ -15,17 +15,17 @@ */ package org.jetbrains.plugins.groovy.lang.psi.stubs.index; -import com.intellij.psi.PsiMember; +import com.intellij.psi.PsiElement; import com.intellij.psi.stubs.StringStubIndexExtension; import com.intellij.psi.stubs.StubIndexKey; /** * @author ilyas */ -public class GrAnnotatedMemberIndex extends StringStubIndexExtension { - public static final StubIndexKey KEY = StubIndexKey.createIndexKey("gr.annot.members"); +public class GrAnnotatedMemberIndex extends StringStubIndexExtension { + public static final StubIndexKey KEY = StubIndexKey.createIndexKey("gr.annot.members"); - public StubIndexKey getKey() { + public StubIndexKey getKey() { return KEY; } } \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/stubs/GroovyCacheUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/stubs/GroovyCacheUtil.java deleted file mode 100644 index 90484d43d8a9..000000000000 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/stubs/GroovyCacheUtil.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2000-2009 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.groovy.lang.stubs; - -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiMember; -import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.stubs.StubIndex; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.plugins.groovy.lang.psi.GrClassSubstitutor; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrAnonymousClassDefinition; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrReferenceList; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMember; -import org.jetbrains.plugins.groovy.lang.psi.stubs.index.GrAnnotatedMemberIndex; -import org.jetbrains.plugins.groovy.lang.psi.stubs.index.GrAnonymousClassIndex; -import org.jetbrains.plugins.groovy.lang.psi.stubs.index.GrDirectInheritorsIndex; - -import java.util.ArrayList; -import java.util.Collection; - -/** - * @author ilyas - */ -public abstract class GroovyCacheUtil { - - @NotNull - public static PsiMember[] getAnnotatedMemberCandidates(PsiClass clazz, GlobalSearchScope scope) { - final String name = clazz.getName(); - if (name == null) return GrMember.EMPTY_ARRAY; - final Collection members = StubIndex.getInstance().get(GrAnnotatedMemberIndex.KEY, name, clazz.getProject(), scope); - return members.toArray(new PsiMember[members.size()]); - } - - @NotNull - public static PsiClass[] getDeriverCandidates(PsiClass clazz, GlobalSearchScope scope) { - final String name = clazz.getName(); - if (name == null) return GrTypeDefinition.EMPTY_ARRAY; - final ArrayList inheritors = new ArrayList(); - final Collection refLists = StubIndex.getInstance().get(GrDirectInheritorsIndex.KEY, name, clazz.getProject(), scope); - for (GrReferenceList list : refLists) { - final PsiElement parent = list.getParent(); - if (parent instanceof GrTypeDefinition) { - inheritors.add(GrClassSubstitutor.getSubstitutedClass(((GrTypeDefinition)parent))); - } - } - final Collection classes = - StubIndex.getInstance().get(GrAnonymousClassIndex.KEY, name, clazz.getProject(), scope); - for (GrAnonymousClassDefinition aClass : classes) { - inheritors.add(aClass); - } - return inheritors.toArray(new PsiClass[inheritors.size()]); - } - - -} From 76162c830e20e868eff55112e385c6a4e095514c Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 26 Jul 2010 23:17:54 +0100 Subject: [PATCH 57/82] find list literal constructor call usages in Groovy++ method calls --- .../GroovyConstructorUsagesSearchHelper.java | 194 +++++++++++++++--- .../plugins/groovy/gpp/GppTypeConverter.java | 15 +- .../lang/LiteralConstructorUsagesTest.groovy | 66 +++++- 3 files changed, 239 insertions(+), 36 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java index 9a46dcfc2899..30c2c35a4c67 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java @@ -18,19 +18,33 @@ package org.jetbrains.plugins.groovy.findUsages; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadActionProcessor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.NullableComputable; import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.impl.light.LightMemberReference; +import com.intellij.psi.search.DelegatingGlobalSearchScope; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.SearchScope; +import com.intellij.psi.search.searches.AnnotatedElementsSearch; import com.intellij.psi.search.searches.DirectClassInheritorsSearch; +import com.intellij.psi.search.searches.MethodReferencesSearch; import com.intellij.psi.search.searches.ReferencesSearch; +import com.intellij.psi.util.CachedValueProvider; +import com.intellij.psi.util.CachedValuesManager; +import com.intellij.psi.util.PsiModificationTracker; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.Processor; +import com.intellij.util.containers.ConcurrentHashSet; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.GroovyFileType; import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils; +import org.jetbrains.plugins.groovy.gpp.GppTypeConverter; +import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap; @@ -38,11 +52,9 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrConstructorInvocat import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrOpenBlock; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrNewExpression; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrSafeCastExpression; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrTypeCastExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.*; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstant; @@ -50,9 +62,14 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMe import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeElement; import org.jetbrains.plugins.groovy.lang.psi.controlFlow.Instruction; +import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.GroovyExpectedTypesProvider; import org.jetbrains.plugins.groovy.lang.psi.impl.GrTupleType; import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + /** * @author Maxim.Medvedev * Date: May 2, 2009 3:48:53 PM @@ -61,11 +78,12 @@ public class GroovyConstructorUsagesSearchHelper { private GroovyConstructorUsagesSearchHelper() { } - public static boolean execute(final PsiMethod constructor, SearchScope searchScope, final Processor consumer) { + public static boolean execute(final PsiMethod constructor, final SearchScope searchScope, final Processor consumer) { if (!constructor.isConstructor()) return true; - if (searchScope instanceof GlobalSearchScope) { - searchScope = GlobalSearchScope.getScopeRestrictedByFileTypes((GlobalSearchScope)searchScope, GroovyFileType.GROOVY_FILE_TYPE); + SearchScope onlyGroovy = searchScope; + if (onlyGroovy instanceof GlobalSearchScope) { + onlyGroovy = GlobalSearchScope.getScopeRestrictedByFileTypes((GlobalSearchScope)onlyGroovy, GroovyFileType.GROOVY_FILE_TYPE); } final PsiClass clazz = ApplicationManager.getApplication().runReadAction(new NullableComputable() { @@ -97,10 +115,11 @@ public class GroovyConstructorUsagesSearchHelper { } - ReferencesSearch.search(clazz, searchScope, true).forEach(new ReadActionProcessor() { + final Set processedMethods = new ConcurrentHashSet(); + ReferencesSearch.search(clazz, searchScope, true).forEach(new Processor() { @Override - public boolean processInReadAction(PsiReference ref) { - return processClassReference(ref, constructor, consumer); + public boolean process(PsiReference ref) { + return processClassReference(ref, clazz, constructor, consumer, processedMethods, searchScope); } }); @@ -111,7 +130,7 @@ public class GroovyConstructorUsagesSearchHelper { } } //super : does not work now, need to invent a way for it to work without repository - if (!DirectClassInheritorsSearch.search(clazz, searchScope).forEach(new Processor() { + if (!DirectClassInheritorsSearch.search(clazz, onlyGroovy).forEach(new Processor() { public boolean process(PsiClass inheritor) { if (inheritor instanceof GrTypeDefinition) { if (!processConstructors(constructor, consumer, inheritor, false)) return false; @@ -125,12 +144,99 @@ public class GroovyConstructorUsagesSearchHelper { return true; } - private static boolean processClassReference(PsiReference ref, final PsiMethod constructor, final Processor consumer) { + @Nullable + private static PsiMethod getMethodToSearchForCallsWithLiteralArguments(PsiElement element, PsiClass clazz, Set processedMethods) { + final PsiParameter parameter = PsiTreeUtil.getParentOfType(element, PsiParameter.class); + if (parameter != null) { + final PsiMethod method = PsiTreeUtil.getParentOfType(parameter, PsiMethod.class); + if (method != null && processedMethods.add(method) && Arrays.asList(method.getParameterList().getParameters()).contains(parameter)) { + final PsiType parameterType = parameter.getType(); + if (parameterType instanceof PsiClassType) { + if (method.getManager().areElementsEquivalent(clazz, ((PsiClassType)parameterType).resolve())) { + return method; + } + } + } + } + return null; + } + + private static boolean processClassReference(final PsiReference ref, + final PsiClass clazz, + final PsiMethod constructor, + final Processor consumer, + final Set processedMethods, SearchScope scope) { final PsiElement element = ref.getElement(); - if (!(element instanceof GrCodeReferenceElement)) { - return true; + if (element instanceof GrCodeReferenceElement) { + if (!ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public Boolean compute() { + return processGroovyConstructorUsages((GrCodeReferenceElement)element, constructor, consumer, ref); + } + })) { + return false; + } + } + final PsiMethod method = ApplicationManager.getApplication().runReadAction(new Computable() { + public PsiMethod compute() { + return getMethodToSearchForCallsWithLiteralArguments(element, clazz, processedMethods); + } + }); + if (method != null) { + return MethodReferencesSearch.search(method, getGppScope(clazz.getProject()).intersectWith(scope), true).forEach(new ReadActionProcessor() { + @Override + public boolean processInReadAction(PsiReference psiReference) { + if (psiReference instanceof GrReferenceElement) { + final PsiElement parent = ((GrReferenceElement)psiReference).getParent(); + if (parent instanceof GrCall) { + final GrArgumentList argList = ((GrCall)parent).getArgumentList(); + if (argList != null) { + boolean checkedTypedContext = false; + + for (GrExpression argument : argList.getExpressionArguments()) { + if (argument instanceof GrListOrMap && !((GrListOrMap)argument).isMap()) { + if (!checkedTypedContext) { + if (!GppTypeConverter.hasTypedContext(parent)) { + return true; + } + checkedTypedContext = true; + } + + for (PsiType psiType : GroovyExpectedTypesProvider.getDefaultExpectedTypes(argument)) { + if (psiType instanceof PsiClassType && + clazz.getManager().areElementsEquivalent(clazz,((PsiClassType)psiType).resolve()) && + !checkListInstantiation(constructor, consumer, (GrListOrMap)argument, (PsiClassType)psiType)) { + return false; + } + } + } + } + } + } + } + return true; + } + }); + } + + return true; + } + + private static GlobalSearchScope getGppScope(final Project project) { + return CachedValuesManager.getManager(project).getCachedValue(project, new CachedValueProvider() { + @Override + public Result compute() { + return Result.create(calcGppScope(project), PsiModificationTracker.JAVA_STRUCTURE_MODIFICATION_COUNT, ProjectRootManager.getInstance(project)); + } + }); + } + + private static boolean processGroovyConstructorUsages(GrCodeReferenceElement element, + final PsiMethod constructor, + final Processor consumer, + PsiReference ref) { final PsiElement parent = element.getParent(); if (parent instanceof GrNewExpression) { final PsiMethod resolvedConstructor = ((GrNewExpression)parent).resolveConstructor(); @@ -167,13 +273,15 @@ public class GroovyConstructorUsagesSearchHelper { } else if (grandpa instanceof GrTypeCastExpression) { final GrTypeCastExpression cast = (GrTypeCastExpression)grandpa; - if (cast.getCastTypeElement() == typeElement && !checkListInstantiation(constructor, consumer, cast.getOperand(), typeElement)) { + if (cast.getCastTypeElement() == typeElement && + !checkListInstantiation(constructor, consumer, cast.getOperand(), typeElement)) { return false; } } else if (grandpa instanceof GrSafeCastExpression) { final GrSafeCastExpression cast = (GrSafeCastExpression)grandpa; - if (cast.getCastTypeElement() == typeElement && !checkListInstantiation(constructor, consumer, cast.getOperand(), typeElement)) { + if (cast.getCastTypeElement() == typeElement && + !checkListInstantiation(constructor, consumer, cast.getOperand(), typeElement)) { return false; } } @@ -181,6 +289,33 @@ public class GroovyConstructorUsagesSearchHelper { return true; } + private static GlobalSearchScope calcGppScope(Project project) { + final GlobalSearchScope allScope = GlobalSearchScope.allScope(project); + final GlobalSearchScope maximal = GlobalSearchScope.getScopeRestrictedByFileTypes(allScope, GroovyFileType.GROOVY_FILE_TYPE); + GlobalSearchScope gppExtensions = new DelegatingGlobalSearchScope(maximal) { + @Override + public boolean contains(VirtualFile file) { + return super.contains(file) && GppTypeConverter.isGppExtension(file.getExtension()); + } + }; + final PsiClass typed = JavaPsiFacade.getInstance(project).findClass(GppTypeConverter.GROOVY_LANG_TYPED, allScope); + if (typed != null) { + final Set files = new HashSet(); + AnnotatedElementsSearch.searchElements(typed, maximal, PsiModifierListOwner.class).forEach(new Processor() { + @Override + public boolean process(PsiModifierListOwner occurrence) { + ContainerUtil.addIfNotNull(occurrence.getContainingFile().getVirtualFile(), files); + return true; + } + }); + + GlobalSearchScope withTypedAnno = GlobalSearchScope.filesScope(project, files); + return withTypedAnno.union(gppExtensions); + } + + return gppExtensions; + } + private static boolean checkListInstantiation(PsiMethod constructor, Processor consumer, GrExpression expression, final GrTypeElement typeElement) { @@ -188,15 +323,24 @@ public class GroovyConstructorUsagesSearchHelper { final GrListOrMap list = (GrListOrMap)expression; if (!list.isMap()) { final PsiType expectedType = typeElement.getType(); - final PsiType listType = list.getType(); - if (listType instanceof GrTupleType && expectedType instanceof PsiClassType) { - final GroovyResolveResult[] candidates = PsiUtil.getConstructorCandidates((PsiClassType)expectedType, ((GrTupleType)listType).getComponentTypes(), list); - for (GroovyResolveResult candidate : candidates) { - if (constructor.getManager().areElementsEquivalent(candidate.getElement(), constructor)) { - if (!consumer.process(PsiReferenceBase.createSelfReference(list, TextRange.from(0, list.getTextLength()), constructor))) { - return false; - } - } + if (expectedType instanceof PsiClassType) { + return checkListInstantiation(constructor, consumer, list, (PsiClassType)expectedType); + } + } + } + return true; + } + + private static boolean checkListInstantiation(PsiMethod constructor, + Processor consumer, + GrListOrMap list, + PsiClassType expectedType) { + final PsiType listType = list.getType(); + if (listType instanceof GrTupleType) { + for (GroovyResolveResult candidate : PsiUtil.getConstructorCandidates(expectedType, ((GrTupleType)listType).getComponentTypes(), list)) { + if (constructor.getManager().areElementsEquivalent(candidate.getElement(), constructor)) { + if (!consumer.process(PsiReferenceBase.createSelfReference(list, TextRange.from(0, list.getTextLength()), constructor))) { + return false; } } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java index 3a4ea0680f77..ab44998ef803 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java @@ -19,26 +19,29 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.types.GrClosureSignatureUtil; */ public class GppTypeConverter extends GrTypeConverter { + public static final String GROOVY_LANG_TYPED = "groovy.lang.Typed"; + public static boolean hasTypedContext(PsiElement context) { if (context == null) { return false; } - if (AnnotatedContextFilter.hasAnnotatedContext(context, "groovy.lang.Typed")) { + if (AnnotatedContextFilter.hasAnnotatedContext(context, GROOVY_LANG_TYPED)) { return true; } final VirtualFile vfile = context.getContainingFile().getOriginalFile().getVirtualFile(); - if (vfile != null) { - final String extension = vfile.getExtension(); - if ("gpp".equals(extension) || "grunit".equals(vfile.getExtension())) { - return true; - } + if (vfile != null && isGppExtension(vfile.getExtension())) { + return true; } return false; } + public static boolean isGppExtension(String extension) { + return "gpp".equals(extension) || "grunit".equals(extension); + } + @Override public Boolean isConvertible(@NotNull PsiType lType, @NotNull PsiType rType, @NotNull GroovyPsiElement context) { if (rType instanceof GrTupleType) { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/LiteralConstructorUsagesTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/LiteralConstructorUsagesTest.groovy index f6e6df14f708..00432a8cb4d0 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/LiteralConstructorUsagesTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/LiteralConstructorUsagesTest.groovy @@ -7,8 +7,12 @@ import com.intellij.psi.search.searches.ReferencesSearch * @author peter */ class LiteralConstructorUsagesTest extends LightCodeInsightFixtureTestCase { + @Override protected void setUp() { + super.setUp(); + myFixture.addClass("package groovy.lang; public @interface Typed {}"); + } - public void testListVariable() throws Exception { + public void testList_Variable() throws Exception { def foo = myFixture.addClass("""class Foo { Foo() {} } @@ -17,7 +21,7 @@ class LiteralConstructorUsagesTest extends LightCodeInsightFixtureTestCase { assertOneElement(ReferencesSearch.search(foo.constructors[0]).findAll()) } - public void testListReturnValue() throws Exception { + public void testList_ReturnValue() throws Exception { def foo = myFixture.addClass("""class Foo { Foo() {} } @@ -26,7 +30,7 @@ class LiteralConstructorUsagesTest extends LightCodeInsightFixtureTestCase { assertEquals(2, ReferencesSearch.search(foo.constructors[0]).findAll().size()) } - public void testListCast() throws Exception { + public void testList_Cast() throws Exception { def foo = myFixture.addClass("""class Foo { Foo() {} } @@ -35,13 +39,65 @@ class LiteralConstructorUsagesTest extends LightCodeInsightFixtureTestCase { assertOneElement(ReferencesSearch.search(foo.constructors[0]).findAll()) } - public void testListAsCast() throws Exception { + public void testList_AsCast() throws Exception { def foo = myFixture.addClass("""class Foo { Foo() {} } -""") +}""") myFixture.addFileToProject "a.groovy", "def x = [] as Foo" assertOneElement(ReferencesSearch.search(foo.constructors[0]).findAll()) } + public void testList_GppMethodCall() throws Exception { + //------------------------declarations + def foo = myFixture.addClass(""" + package z; + class Foo { + public Foo() {} + } + """) + + myFixture.addClass(""" + package z; + public class Bar { + public static void giveMeFoo(int a, Foo f) {} + } +""") + myFixture.addFileToProject("Decl.groovy", "static def giveMeFooAsWell(z.Foo f) {}") + + //----------------------usages + myFixture.addFileToProject "a.gpp", "z.Bar.giveMeFoo(2, []) //usage" + myFixture.addFileToProject "b.groovy", """ + @Typed package aa; + z.Bar.giveMeFoo(3, []) //usage + """ + myFixture.addFileToProject "c.groovy", """ + @Typed def someMethod() { + z.Bar.giveMeFoo 4, [] //usage + Decl.giveMeFooAsWell([]) //usage + } + z.Bar.giveMeFoo 5, [] //non-typed context + Decl.giveMeFooAsWell([]) + """ + myFixture.addFileToProject "invalid.gpp", "z.Bar.giveMeFoo 42, 239, []" + myFixture.addFileToProject "nonGpp.groovy", "z.Bar.giveMeFoo(6, [])" + assertEquals(4, ReferencesSearch.search(foo.constructors[0]).findAll().size()) + } + + public void testList_GppConstructorCallWithSeveralParameters() throws Exception { + def foo = myFixture.addClass(""" + class Foo { + Foo() {} + } + """) + + myFixture.addClass(""" + class Bar { + Bar(Foo f1, Foo f2, Foo f3) {} + } + """) + myFixture.addFileToProject "a.gpp", "new Bar([],[],[])" + assertEquals(3, ReferencesSearch.search(foo.constructors[0]).findAll().size()) + } + } From ddc205389a3aef8d7ddbe12062baf997874cf33a Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 27 Jul 2010 20:55:24 +0100 Subject: [PATCH 58/82] merge with maxim's changes --- .../findUsages/GroovyConstructorUsagesSearchHelper.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java index 30c2c35a4c67..e44211b20192 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java @@ -56,6 +56,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgument import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrOpenBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.*; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrAnonymousClassDefinition; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstant; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; @@ -237,7 +238,11 @@ public class GroovyConstructorUsagesSearchHelper { final PsiMethod constructor, final Processor consumer, PsiReference ref) { - final PsiElement parent = element.getParent(); + PsiElement parent = element.getParent(); + + if (parent instanceof GrAnonymousClassDefinition) { + parent = parent.getParent(); + } if (parent instanceof GrNewExpression) { final PsiMethod resolvedConstructor = ((GrNewExpression)parent).resolveConstructor(); if (constructor.getManager().areElementsEquivalent(resolvedConstructor, constructor) && !consumer.process(ref)) { From aeb8d154865c1a1fbdd18a1097d88d6d6ca587bd Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Thu, 29 Jul 2010 11:05:44 +0400 Subject: [PATCH 59/82] progress message --- .../impl/src/com/intellij/compiler/impl/CompileDriver.java | 2 +- 1 file changed, 1 insertion(+), 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 5a29390a9e1d..9be9f12406dd 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java @@ -973,7 +973,7 @@ public class CompileDriver { if (context.getProgressIndicator().isCanceled()) { throw new ExitException(ExitStatus.CANCELLED); } - + context.getProgressIndicator().setText("Preparing sources for " + compiler.getDescription()); DumbService.getInstance(myProject).waitForSmartMode(); if (round == 0) { From da0aec126ed4e76fd9c63c5caa60d9ef22783b16 Mon Sep 17 00:00:00 2001 From: irengrig Date: Thu, 29 Jul 2010 13:01:37 +0400 Subject: [PATCH 60/82] IDEA-55537 VCS: consider rework of changes view for performance --- .../com/intellij/openapi/vcs/changes/ui/TreeModelBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/TreeModelBuilder.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/TreeModelBuilder.java index f6d6ab11eaa1..862e2875c432 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/TreeModelBuilder.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/TreeModelBuilder.java @@ -221,7 +221,7 @@ public class TreeModelBuilder { final FilePath fp1 = ChangesUtil.getFilePath(o1); final FilePath fp2 = ChangesUtil.getFilePath(o2); - final int diff = fp1.getPath().length() - fp2.getPath().length(); + final int diff = fp1.getIOFile().getPath().length() - fp2.getIOFile().getPath().length(); return diff == 0 ? 0 : (diff < 0 ? -1 : 1); } } From 3e3fdcbb1808d4af698dc6736e12d52e10d9685e Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Thu, 29 Jul 2010 14:08:43 +0400 Subject: [PATCH 61/82] enable annotation processors run on code from test source roots (IDEA-55836) --- .../impl/javaCompiler/AnnotationProcessingCompiler.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/AnnotationProcessingCompiler.java b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/AnnotationProcessingCompiler.java index 00357520f65b..3fcac756823b 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/AnnotationProcessingCompiler.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/AnnotationProcessingCompiler.java @@ -76,6 +76,10 @@ public class AnnotationProcessingCompiler implements TranslatingCompiler{ final String path = CompilerPaths.getAnnotationProcessorsGenerationPath(module); return path != null? lfs.findFileByPath(path) : null; } + + public VirtualFile getModuleOutputDirectoryForTests(Module module) { + return getModuleOutputDirectory(module); + } }; final JavacCompiler javacCompiler = getBackEndCompiler(); final boolean processorMode = javacCompiler.setAnnotationProcessorMode(true); From aee149a574fdce2aee05e3ea4c099c5fb65916c9 Mon Sep 17 00:00:00 2001 From: Denis Zhdanov Date: Thu, 29 Jul 2010 15:28:44 +0400 Subject: [PATCH 62/82] IDEA-56352 Soft wrap: content of folded code is incorrectly displayed if it is wrapped; visual defects appear Soft-wrapped collapsed folding regions processing is corrected --- .../hint/DocumentFragmentTooltipRenderer.java | 10 +- .../openapi/editor/ex/util/EditorUtil.java | 9 +- .../openapi/editor/impl/EditorImpl.java | 3 +- .../impl/softwrap/SoftWrapDataMapper.java | 528 ++++++++++-------- .../impl/softwrap/SoftWrapDataMapperTest.java | 100 +++- 5 files changed, 367 insertions(+), 283 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/codeInsight/hint/DocumentFragmentTooltipRenderer.java b/platform/platform-impl/src/com/intellij/codeInsight/hint/DocumentFragmentTooltipRenderer.java index ed11745842d1..73ab41d5e2b3 100644 --- a/platform/platform-impl/src/com/intellij/codeInsight/hint/DocumentFragmentTooltipRenderer.java +++ b/platform/platform-impl/src/com/intellij/codeInsight/hint/DocumentFragmentTooltipRenderer.java @@ -15,10 +15,7 @@ */ package com.intellij.codeInsight.hint; -import com.intellij.openapi.editor.Document; -import com.intellij.openapi.editor.DocumentFragment; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.LogicalPosition; +import com.intellij.openapi.editor.*; import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.editor.ex.FoldingModelEx; import com.intellij.openapi.util.TextRange; @@ -51,7 +48,10 @@ public class DocumentFragmentTooltipRenderer implements TooltipRenderer { JLayeredPane layeredPane = editorComponent.getRootPane().getLayeredPane(); - p = editor.logicalPositionToXY(new LogicalPosition(startLine, 0)); + // There is a possible case that collapsed folding region is soft wrapped, hence, we need to anchor + // not logical but visual line start. + VisualPosition visual = editor.offsetToVisualPosition(startOffset); + p = editor.visualPositionToXY(visual); p = SwingUtilities.convertPoint( ((EditorEx)editor).getGutterComponentEx(), p, diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUtil.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUtil.java index a62e1d0526ee..a12865d77d70 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUtil.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUtil.java @@ -341,11 +341,10 @@ public class EditorUtil { for (int i = start; i < end; i++) { char c = text.charAt(i); prevX = x; - if (c == '\t') { - x = nextTabStop(x, editor); - } - else { - x += charWidth(c, Font.PLAIN, editor); + switch (c) { + case '\t': x = nextTabStop(x, editor); break; + case '\n': x = result = 0; break; + default: x += charWidth(c, Font.PLAIN, editor); } result += columnsNumber(c, x, prevX, getSpaceWidth(Font.PLAIN, editor)); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index 6b743f8f0687..7d1ecdca7eae 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -2700,6 +2700,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi } if (column < 0) column = 0; + line = Math.min(line, myDocument.getLineCount() - 1); LogicalPosition softWrapUnawareResult = new LogicalPosition(line, column); return mySoftWrapModel.adjustLogicalPosition(softWrapUnawareResult, visiblePos); @@ -4797,7 +4798,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi // I.e. we shouldn't use widths of the lines that are not shown for max width calculation because previous widths are calculated // for another visible area width. int startToUse = 0; - int endToUse = lineCount; + int endToUse = Math.min(lineCount, myLineWidths.size()); if (getSoftWrapModel().isSoftWrappingEnabled()) { Rectangle visibleArea = getScrollingModel().getVisibleArea(); startToUse = xyToLogicalPosition(visibleArea.getLocation()).line + 1; diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/SoftWrapDataMapper.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/SoftWrapDataMapper.java index 3553be49e63b..8aa093783ce5 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/SoftWrapDataMapper.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/SoftWrapDataMapper.java @@ -20,6 +20,7 @@ import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.editor.impl.EditorTextRepresentationHelper; import com.intellij.openapi.editor.impl.IterationState; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.text.CharArrayUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -36,6 +37,8 @@ import java.util.List; */ public class SoftWrapDataMapper { + private static final VisualPosition DUMMY_VISUAL = new VisualPosition(Integer.MAX_VALUE, Integer.MAX_VALUE); + private final CharBuffer myCharBuffer = CharBuffer.allocate(1); private final EditorTextRepresentationHelper myTextRepresentationHelper; @@ -67,6 +70,17 @@ public class SoftWrapDataMapper { @NotNull public LogicalPosition adjustLogicalPosition(@NotNull LogicalPosition defaultLogical, @NotNull VisualPosition visual) { + try { + return doAdjustLogicalPosition(defaultLogical, visual); + } + finally { + myFontTypeProvider.cleanup(); + } + } + + @SuppressWarnings({"AssignmentToForLoopParameter"}) + @NotNull + private LogicalPosition doAdjustLogicalPosition(@NotNull LogicalPosition defaultLogical, @NotNull VisualPosition visual) { Document document = myEditor.getDocument(); int maxOffset = document.getLineEndOffset(Math.min(defaultLogical.line, document.getLineCount() - 1)); @@ -86,7 +100,7 @@ public class SoftWrapDataMapper { int max = Math.min(softWraps.size(), endIndex); for (; i < max; i++) { TextChange softWrap = softWraps.get(i); - if (foldingModel.isOffsetCollapsed(softWrap.getStart())) { + if (!isVisible(softWrap)) { continue; } @@ -97,10 +111,11 @@ public class SoftWrapDataMapper { if (visualLineBeforeSoftWrapAppliance > visual.line) { softWrapLinesBeforeCurrentLogicalLine += softWrapLinesOnCurrentLogicalLine; int logicalLine = defaultLogical.line - softWrapLinesBeforeCurrentLogicalLine; - LogicalPosition foldingUnawarePosition = new LogicalPosition( - logicalLine, defaultLogical.column, softWrapLinesBeforeCurrentLogicalLine, 0, 0, 0, 0 + return new LogicalPosition( + logicalLine, defaultLogical.column, softWrapLinesBeforeCurrentLogicalLine, 0, 0, + getFoldedLinesBefore(document.getLineStartOffset(logicalLine)), + visual.column - defaultLogical.column ); - return adjustFoldingData(foldingModel, foldingUnawarePosition); } if (lastSoftWrapLogicalLine >= 0 && lastSoftWrapLogicalLine != softWrapLine) { @@ -115,24 +130,29 @@ public class SoftWrapDataMapper { continue; } + int startLineOffset = document.getLineStartOffset(softWrapLine); + int endLineOffset = document.getLineEndOffset(softWrapLine); + FoldRegion region = foldingModel.getCollapsedRegionAtOffset(endLineOffset); + while (region != null) { + int line = document.getLineNumber(region.getEndOffset()); + endLineOffset = document.getLineEndOffset(line); + region = foldingModel.getCollapsedRegionAtOffset(endLineOffset); + } + CharSequence documentText = document.getCharsSequence(); + // If we're here that means that current soft wrap affects logical line that is matched to the given visual line. // We iterate from the logical line start then in order to calculate resulting logical position. Context context = new Context( - defaultLogical, visual, softWrapLinesBeforeCurrentLogicalLine, softWrapLinesOnCurrentLogicalLine, - visualLineBeforeSoftWrapAppliance, foldingModel + visual, softWrapLine, softWrapLinesBeforeCurrentLogicalLine, softWrapLinesOnCurrentLogicalLine, + visualLineBeforeSoftWrapAppliance, getFoldedLinesBefore(startLineOffset) ); - int startLineOffset = document.getLineStartOffset(softWrapLine); - int endLineOffset = document.getLineEndOffset(softWrapLine); - CharSequence documentText = document.getCharsSequence(); - myFontTypeProvider.init(startLineOffset); - context.fontType = myFontTypeProvider.getFontType(startLineOffset); for (int j = startLineOffset; j < endLineOffset; j++) { // Process soft wrap at the current offset if any. TextChange softWrapToProcess = myStorage.getSoftWrap(j); - if (softWrapToProcess != null) { + if (softWrapToProcess != null && isVisible(softWrapToProcess)) { context.beforeSoftWrap(); if (j >= softWrap.getStart()) { CharSequence softWrapText = softWrapToProcess.getText(); @@ -146,7 +166,16 @@ public class SoftWrapDataMapper { context.afterSoftWrap(); } - context.fontType = myFontTypeProvider.getFontType(startLineOffset); + context.fontType = myFontTypeProvider.getFontType(j); + + FoldRegion foldRegion = foldingModel.getCollapsedRegionAtOffset(j); + if (foldRegion != null) { + LogicalPosition result = context.onCollapsedFolding(foldRegion); + if (result != null) { + return result; + } + j = foldRegion.getEndOffset(); + } // Process document symbol. LogicalPosition result = context.onNonSoftWrapSymbol(documentText.charAt(j)); @@ -154,27 +183,20 @@ public class SoftWrapDataMapper { return result; } } - myFontTypeProvider.cleanup(); // If we are here that means that target visual position is located at virtual space after the line end. - int logicalLine = defaultLogical.line - softWrapLinesBeforeCurrentLogicalLine - - context.softWrapLinesOnCurrentLineBeforeTargetSoftWrap - context.targetSoftWrapLines; - int logicalColumn = context.symbolsOnCurrentLogicalLine + visual.column - context.symbolsOnCurrentVisualLine; - int softWrapColumnDiff = visual.column - logicalColumn; - LogicalPosition foldingUnawarePosition = new LogicalPosition( - logicalLine, logicalColumn, softWrapLinesBeforeCurrentLogicalLine, - context.softWrapLinesOnCurrentLineBeforeTargetSoftWrap + context.targetSoftWrapLines, softWrapColumnDiff, 0, 0 - ); - return adjustFoldingData(foldingModel, foldingUnawarePosition); + context.logicalColumn += visual.column - context.visualColumn; + return context.build(); } // If we are here that means that there is no soft wrap on a logical line that corresponds to the target visual line. softWrapLinesBeforeCurrentLogicalLine += softWrapLinesOnCurrentLogicalLine; int logicalLine = defaultLogical.line - softWrapLinesBeforeCurrentLogicalLine; - LogicalPosition foldingUnaware = new LogicalPosition( - logicalLine, defaultLogical.column, softWrapLinesBeforeCurrentLogicalLine, 0, 0, 0, 0 + int foldedLines = getFoldedLinesBefore(document.getLineStartOffset(logicalLine)); + int foldingColumnDiff = visual.column - defaultLogical.column; + return new LogicalPosition( + logicalLine, defaultLogical.column, softWrapLinesBeforeCurrentLogicalLine, 0, 0, foldedLines, foldingColumnDiff ); - return adjustFoldingData(foldingModel, foldingUnaware); } @NotNull @@ -202,7 +224,6 @@ public class SoftWrapDataMapper { int lineDiff = 0; int column = -1; - FoldingModel foldingModel = myEditor.getFoldingModel(); int targetLogicalLineStartOffset = myEditor.logicalPositionToOffset(new LogicalPosition(logical.line, 0)); for (int i = endIndex; i >= 0; i--) { TextChange softWrap = softWraps.get(i); @@ -211,7 +232,7 @@ public class SoftWrapDataMapper { continue; } - if (foldingModel.isOffsetCollapsed(softWrap.getStart())) { + if (!isVisible(softWrap)) { continue; } @@ -237,120 +258,161 @@ public class SoftWrapDataMapper { return new VisualPosition(visual.line + lineDiff, columnToUse); } - @SuppressWarnings({"AssignmentToForLoopParameter"}) public LogicalPosition offsetToLogicalPosition(int offset) { + try { + return doOffsetToLogicalPosition(offset); + } + finally { + myFontTypeProvider.cleanup(); + } + } + + @SuppressWarnings({"AssignmentToForLoopParameter"}) + private LogicalPosition doOffsetToLogicalPosition(int offset) { + FoldingModel foldingModel = myEditor.getFoldingModel(); Document document = myEditor.getDocument(); - CharSequence chars = document.getCharsSequence(); + CharSequence text = document.getCharsSequence(); + int line = document.getLineNumber(offset); + int lineStartOffset = document.getLineStartOffset(line); + FoldRegion region = foldingModel.getCollapsedRegionAtOffset(lineStartOffset); + while (region != null && region.getStartOffset() != lineStartOffset) { + line = document.getLineNumber(region.getStartOffset()); + lineStartOffset = document.getLineStartOffset(line); + region = foldingModel.getCollapsedRegionAtOffset(lineStartOffset); + } - int targetLine = document.getLineNumber(offset); - int targetLineStartOffset = document.getLineStartOffset(targetLine); + Context context = new Context(line, getSoftWrapIntroducedLinesBefore(lineStartOffset), getFoldedLinesBefore(lineStartOffset)); + myFontTypeProvider.init(lineStartOffset); + context.fontType = myFontTypeProvider.getFontType(lineStartOffset); + for (int i = lineStartOffset; i <= offset; i++) { + TextChangeImpl softWrap = myStorage.getSoftWrap(i); + if (softWrap != null) { + context.beforeSoftWrap(); + CharSequence softWrapText = softWrap.getText(); + for (int k = 0; k < softWrapText.length(); k++) { + context.onSoftWrapSymbol(softWrapText.charAt(k)); + } + context.afterSoftWrap(); + } - int softWrapIntroducedLinesBefore = 0; - int softWrapsOnCurrentLogicalLine = 0; - int symbolsOnCurrentLogicalLine = 0; - int symbolsOnCurrentVisibleLine = 0; - List softWraps = myStorage.getSoftWraps(); + if (i == offset) { + // We want to count soft wrap that is registered at target offset if any but not exceeding document symbols. + break; + } - // Retrieve information about logical position that is soft-wraps unaware. - LogicalPosition rawLineStartLogicalPosition = myEditor.offsetToLogicalPosition(targetLineStartOffset); + region = foldingModel.getCollapsedRegionAtOffset(i); + if (region != null) { + processFoldRegion(context, region, offset); + if (offset <= region.getEndOffset()) { + break; + } + i = region.getEndOffset(); + } + context.fontType = myFontTypeProvider.getFontType(i); + context.onNonSoftWrapSymbol(text.charAt(i)); + } + return new LogicalPosition( + context.logicalLine, + context.logicalColumn, + context.softWrapLinesBefore, + context.targetSoftWrapLines, + context.softWrapColumnDiff, + getFoldedLinesBefore(offset), + context.foldingColumnDiff + ); + } + + /** + * Processes given collapsed fold region assuming that we need to stop at a target offset. + *

+ * Processing result is updated state of the given context object. + * + * @param context processing data holder + * @param region collapsed fold region to process + * @param offset target stop offset + */ + @SuppressWarnings({"AssignmentToForLoopParameter"}) + private void processFoldRegion(Context context, FoldRegion region, int offset) { + CharSequence text = myEditor.getDocument().getCharsSequence(); + int max = Math.min(offset, region.getEndOffset()); + boolean multilineFolding = false; + for (int i = region.getStartOffset(); i < max;) { + int lineFeedOffset = CharArrayUtil.shiftForwardUntil(text, i, "\n"); + if (lineFeedOffset < max) { + context.softWrapLinesBefore += context.targetSoftWrapLines; + context.targetSoftWrapLines = 0; + context.softWrapColumnDiff = 0; + context.foldedLines++; + context.logicalColumn = 0; + context.foldingColumnDiff = context.visualColumn; + context.logicalLine++; + i = lineFeedOffset + 1; + multilineFolding = true; + } + else { + if (multilineFolding) { + context.logicalColumn = myTextRepresentationHelper.toVisualColumnSymbolsNumber(text, i, max, 0); + context.foldingColumnDiff = context.visualColumn - context.logicalColumn; + break; + } + else { + int foldedColumns = myTextRepresentationHelper.toVisualColumnSymbolsNumber(text, region.getStartOffset(), max, context.x); + context.logicalColumn += foldedColumns; + context.foldingColumnDiff -= foldedColumns; + if (offset >= region.getEndOffset()) { + context.foldingColumnDiff += region.getPlaceholderText().length(); + } + return; + } + } + } + + if (offset >= region.getEndOffset()) { + int foldPlaceholderColumns = region.getPlaceholderText().length(); + context.visualColumn += foldPlaceholderColumns; + context.foldingColumnDiff += foldPlaceholderColumns; + context.x += foldPlaceholderColumns * myTextRepresentationHelper.charWidth(' ', context.x, Font.PLAIN); + } + } + + /** + * Allows to answer how many soft wrap-introduced visual lines are located before the given offset. + * + * @param offset target offset + * @return number of soft wrap-introduced visual lines are located before the given offset + */ + private int getSoftWrapIntroducedLinesBefore(int offset) { + int result = 0; + List softWraps = myStorage.getSoftWraps(); // Calculate number of soft wrap-introduced lines before the line that holds target offset. - int index = myStorage.getSoftWrapIndex(targetLineStartOffset); + int index = myStorage.getSoftWrapIndex(offset); if (index < 0) { index = -index - 1; } int max = Math.min(index, softWraps.size()); for (int j = 0; j < max; j++) { - softWrapIntroducedLinesBefore += StringUtil.countNewLines(softWraps.get(j).getText()); - } - - FoldingModel foldingModel = myEditor.getFoldingModel(); - - // Return eagerly if there are no soft wraps before the target offset on a line that contains it. - if (max >= softWraps.size() || softWraps.get(max).getStart() > offset) { - int column = myTextRepresentationHelper.toVisualColumnSymbolsNumber(chars, targetLineStartOffset, offset, 0); - LogicalPosition foldingUnawarePosition = new LogicalPosition( - rawLineStartLogicalPosition.line, column, softWrapIntroducedLinesBefore, 0, 0, 0, 0 - ); - return adjustFoldingData(foldingModel, foldingUnawarePosition); - } - - // Calculate number of lines and columns introduced by soft wrap located at the line that holds target offset if any. - - - // We add '1' here in order to correctly process situation when there is soft wrap at target offset (it impacts resulting logical - // position but document symbol at that offset should not be count). - max = Math.min(chars.length(), offset + 1); - int x = 0; - myFontTypeProvider.init(targetLineStartOffset); - int fontType = myFontTypeProvider.getFontType(targetLineStartOffset); - - for (int i = targetLineStartOffset; i < max; i++) { - FoldRegion region = foldingModel.getCollapsedRegionAtOffset(i); - if (region != null) { - // Assuming that folded region placeholder doesn't contain line feed symbols. - i = region.getEndOffset(); - symbolsOnCurrentVisibleLine += region.getPlaceholderText().length(); - continue; + TextChange softWrap = softWraps.get(j); + if (isVisible(softWrap)) { + result += StringUtil.countNewLines(softWrap.getText()); } - - TextChange softWrap = myStorage.getSoftWrap(i); - if (softWrap != null) { - CharSequence softWrapText = softWrap.getText(); - for (int j = 0; j < softWrapText.length(); j++) { - if (softWrapText.charAt(j) == '\n') { - softWrapsOnCurrentLogicalLine++; - symbolsOnCurrentVisibleLine = 0; - x = 0; - } - else { - symbolsOnCurrentVisibleLine++; - x += myTextRepresentationHelper.charWidth(softWrapText.charAt(j), x, fontType); - } - } - symbolsOnCurrentVisibleLine++; // For 'after soft wrap' sign. - x += myPainter.getMinDrawingWidth(SoftWrapDrawingType.AFTER_SOFT_WRAP); - } - - // We don't want to count symbol at target offset. - if (i == offset) { - break; - } - - fontType = myFontTypeProvider.getFontType(targetLineStartOffset); - - // Assuming that no line feed is contained before target offset on a line that holds it. - int columnsForSymbol = toVisualColumnSymbolsNumber(chars.charAt(i), x); - symbolsOnCurrentLogicalLine += columnsForSymbol; - symbolsOnCurrentVisibleLine += columnsForSymbol; - x += myTextRepresentationHelper.charWidth(chars.charAt(i), x, fontType); } - myFontTypeProvider.cleanup(); - - LogicalPosition foldingUnawarePosition = new LogicalPosition( - rawLineStartLogicalPosition.line, symbolsOnCurrentLogicalLine, softWrapIntroducedLinesBefore, softWrapsOnCurrentLogicalLine, - symbolsOnCurrentVisibleLine - symbolsOnCurrentLogicalLine, 0, 0 - ); - return adjustFoldingData(foldingModel, foldingUnawarePosition); + return result; } /** - * Builds folding-aware logical position on the basis of the given folding-unaware position and folding model + * Allows to answer how many folded lines are located before the logical line that contains given offset. * - * @param foldingModel folding model to use for retrieving information about folding - * @param position folding-unaware logical position - * @return folding-aware logical position + * @param offset target offset + * @return number of folded lines are located before the logical line that contains given offset. */ - private LogicalPosition adjustFoldingData(FoldingModel foldingModel, LogicalPosition position) { - int offset = myEditor.logicalPositionToOffset(position); - int foldedLines = 0; - int foldColumnDiff = 0; - int softWrapColumnDiff = position.softWrapColumnDiff; + private int getFoldedLinesBefore(int offset) { Document document = myEditor.getDocument(); - int targetLine = document.getLineNumber(offset); - int lastFoldEndLogicalLine = -1; - for (FoldRegion foldRegion : foldingModel.getAllFoldRegions()) { - if (foldRegion.getStartOffset() >= offset) { + int line = document.getLineNumber(offset); + int lineStartOffset = document.getLineStartOffset(line); + int result = 0; + for (FoldRegion foldRegion : myEditor.getFoldingModel().getAllFoldRegions()) { + if (foldRegion.getStartOffset() >= lineStartOffset) { break; } @@ -360,99 +422,20 @@ public class SoftWrapDataMapper { int foldingStartLine = document.getLineNumber(foldRegion.getStartOffset()); int foldingEndLine = document.getLineNumber(foldRegion.getEndOffset()); - foldedLines += Math.min(targetLine, foldingEndLine) - foldingStartLine; - - // Process situation when target offset is located inside the folded region. - if (offset >= foldRegion.getStartOffset()) { - if (offset < foldRegion.getEndOffset()) { - // Our purpose is to define folding data in order to point to the visual folding start. - int visualFoldingStartColumn = calculateVisualFoldingStartColumn(foldRegion); - int diff = visualFoldingStartColumn - position.column - softWrapColumnDiff; - if (lastFoldEndLogicalLine == foldingStartLine) { - foldColumnDiff += diff; - } - else { - foldColumnDiff = diff; - } - return new LogicalPosition( - position.line, position.column, position.softWrapLinesBeforeCurrentLogicalLine, position.softWrapLinesOnCurrentLogicalLine, - softWrapColumnDiff, foldedLines, foldColumnDiff - ); - } - - int diff = getFoldColumnDiff(foldRegion); - if (lastFoldEndLogicalLine == foldingStartLine) { - foldColumnDiff += diff; - } - else { - foldColumnDiff = diff; - } - lastFoldEndLogicalLine = foldingEndLine; - } - } - - if (lastFoldEndLogicalLine != position.line) { - foldColumnDiff = 0; - } - - return new LogicalPosition( - position.line, position.column, position.softWrapLinesBeforeCurrentLogicalLine, position.softWrapLinesOnCurrentLogicalLine, - softWrapColumnDiff, foldedLines, foldColumnDiff - ); - } - - private int getFoldColumnDiff(FoldRegion region) { - int visualFoldingStartColumn = calculateVisualFoldingStartColumn(region); - LogicalPosition foldEndLogical = myEditor.offsetToLogicalPosition(region.getEndOffset()); - // Assuming that there is no tabulations symbols at placeholder text. - int foldingPlaceholderWidth = region.getPlaceholderText().length(); - return visualFoldingStartColumn + foldingPlaceholderWidth - foldEndLogical.column; - } - - private int calculateVisualFoldingStartColumn(FoldRegion region) { - Document document = myEditor.getDocument(); - int foldingStartOffset = region.getStartOffset(); - int logicalLine = document.getLineNumber(foldingStartOffset); - int logicalLineStartOffset = document.getLineStartOffset(logicalLine); - - int softWrapIndex = myStorage.getSoftWrapIndex(logicalLineStartOffset); - if (softWrapIndex < 0) { - softWrapIndex = -softWrapIndex - 1; - } - - List softWraps = myStorage.getSoftWraps(); - int startOffsetOfVisualLineWithFoldingStart = logicalLineStartOffset; - int softWrapOffsetInColumns = 0; - for (; softWrapIndex < softWraps.size(); softWrapIndex++) { - TextChange softWrap = softWraps.get(softWrapIndex); - if (softWrap.getStart() >= foldingStartOffset) { - break; - } - - startOffsetOfVisualLineWithFoldingStart = softWrap.getStart(); - softWrapOffsetInColumns = numberOfSymbolsOnLastVisualLine(softWrap); - } - - assert startOffsetOfVisualLineWithFoldingStart <= foldingStartOffset; - int x = softWrapOffsetInColumns * myTextRepresentationHelper.charWidth(' ', 0, Font.PLAIN); - return myTextRepresentationHelper.toVisualColumnSymbolsNumber( - document.getCharsSequence(), startOffsetOfVisualLineWithFoldingStart, foldingStartOffset, x - ); - } - - private static int numberOfSymbolsOnLastVisualLine(TextChange textChange) { - int result = 0; - for (int i = textChange.getText().length() - 1; i >= 0; i--) { - if (i == '\n') { - return result; - } - else { - result++; - } + result += Math.min(line, foldingEndLine) - foldingStartLine; } return result; } + private boolean isVisible(TextChange softWrap) { + FoldingModel foldingModel = myEditor.getFoldingModel(); + int start = softWrap.getStart(); + + // There is a possible case that folding region starts just after soft wrap, i.e. soft wrap and folding region share the + // same offset. However, soft wrap is shown, hence, we also check offset just before the target one. + return !foldingModel.isOffsetCollapsed(start) || !foldingModel.isOffsetCollapsed(start - 1); + } + private int toVisualColumnSymbolsNumber(char c, int x) { myCharBuffer.clear(); myCharBuffer.put(c); @@ -462,28 +445,36 @@ public class SoftWrapDataMapper { private class Context { - public final FoldingModel foldingModel; - public final LogicalPosition softWrapUnawareLogicalPosition; public final VisualPosition targetVisualPosition; - public final int softWrapLinesBefore; public final int visualLineBeforeSoftWrapAppliance; public final int softWrapLinesOnCurrentLineBeforeTargetSoftWrap; + public int logicalLine; + public int visualLine; + public int softWrapLinesBefore; public int targetSoftWrapLines; - public int symbolsOnCurrentLogicalLine; - public int symbolsOnCurrentVisualLine; + public int softWrapColumnDiff; + public int logicalColumn; + public int visualColumn; + public int foldedLines; + public int foldingColumnDiff; public int x; public int fontType; - Context(LogicalPosition softWrapUnawareLogicalPosition, VisualPosition targetVisualPosition, int softWrapLinesBefore, - int softWrapLinesOnCurrentLineBeforeTargetSoftWrap, int visualLineBeforeSoftWrapAppliance, FoldingModel foldingModel) + Context(int logicalLine, int softWrapLinesBefore, int foldedLines) { + this(DUMMY_VISUAL, logicalLine, softWrapLinesBefore, 0, 0, foldedLines); + } + + Context(VisualPosition targetVisualPosition, int logicalLine, int softWrapLinesBefore, + int softWrapLinesOnCurrentLineBeforeTargetSoftWrap, int visualLineBeforeSoftWrapAppliance, int foldedLines) { - this.softWrapUnawareLogicalPosition = softWrapUnawareLogicalPosition; this.targetVisualPosition = targetVisualPosition; this.softWrapLinesBefore = softWrapLinesBefore; this.softWrapLinesOnCurrentLineBeforeTargetSoftWrap = softWrapLinesOnCurrentLineBeforeTargetSoftWrap; this.visualLineBeforeSoftWrapAppliance = visualLineBeforeSoftWrapAppliance; - this.foldingModel = foldingModel; + this.foldedLines = foldedLines; + this.logicalLine = logicalLine; + visualLine = visualLineBeforeSoftWrapAppliance + targetSoftWrapLines; } /** @@ -498,19 +489,24 @@ public class SoftWrapDataMapper { // Process line feed inside soft wrap. if (c == '\n') { if (targetVisualPosition.line == visualLineBeforeSoftWrapAppliance + targetSoftWrapLines) { - return build(targetVisualPosition.column - symbolsOnCurrentLogicalLine); + softWrapColumnDiff = targetVisualPosition.column - logicalColumn; + return build(); } else { x = 0; + softWrapColumnDiff = -logicalColumn; targetSoftWrapLines++; - symbolsOnCurrentVisualLine = 0; + visualLine++; + visualColumn = 0; return null; } } + softWrapColumnDiff++; + // Just update information about tracked symbols number if current visual line is too low. if (targetVisualPosition.line > visualLineBeforeSoftWrapAppliance + targetSoftWrapLines) { - symbolsOnCurrentVisualLine += toVisualColumnSymbolsNumber(c, x); + visualColumn += toVisualColumnSymbolsNumber(c, x); x += myTextRepresentationHelper.charWidth(c, x, fontType); return null; } @@ -518,15 +514,15 @@ public class SoftWrapDataMapper { // There is a possible case that, for example, target visual column is zero and it points to the soft-wrapped line, // i.e. soft wrap are. We shouldn't count symbols then. Hence, we perform this preliminary examination with eager // return if necessary. - if (targetVisualPosition.column <= symbolsOnCurrentVisualLine) { + if (targetVisualPosition.column <= visualColumn) { return build(); } // Process non-line feed inside soft wrap. - symbolsOnCurrentVisualLine++; // Don't expect tabulation to be used inside soft wrap text. + visualColumn++; // Don't expect tabulation to be used inside soft wrap text. x += myTextRepresentationHelper.charWidth(c, x, fontType); - if (targetVisualPosition.column <= symbolsOnCurrentVisualLine) { + if (targetVisualPosition.column <= visualColumn) { return build(); } else { @@ -540,7 +536,54 @@ public class SoftWrapDataMapper { public void afterSoftWrap() { x += myPainter.getMinDrawingWidth(SoftWrapDrawingType.AFTER_SOFT_WRAP); - symbolsOnCurrentVisualLine++; + visualColumn++; + softWrapColumnDiff++; + } + + @SuppressWarnings({"AssignmentToForLoopParameter"}) + @Nullable + public LogicalPosition onCollapsedFolding(FoldRegion region) { + int visualFoldingPlaceholderWidth = region.getPlaceholderText().length(); // Assuming that no tabs are used as placeholder + + // Process situation when target visual position points to collapsed folding placeholder. + if (visualLine == targetVisualPosition.line && visualColumn + visualFoldingPlaceholderWidth > targetVisualPosition.column) { + return build(); + } + + // If control flow reaches this point that means that we should process whole folded region and update current object state. + CharSequence text = myEditor.getDocument().getCharsSequence(); + boolean multiline = false; + for (int i = region.getStartOffset(); i < region.getEndOffset();) { + int lineFeedOffset = CharArrayUtil.shiftForwardUntil(text, i, "\n"); + // Process multiline folded text. + if (lineFeedOffset < region.getEndOffset()) { + logicalLine++; + foldedLines++; + logicalColumn = 0; + softWrapLinesBefore += targetSoftWrapLines; + targetSoftWrapLines = 0; + softWrapColumnDiff = 0; + i = lineFeedOffset + 1; + multiline = true; + } + else { + if (multiline) { + logicalColumn = myTextRepresentationHelper.toVisualColumnSymbolsNumber(text, i, region.getEndOffset(), 0); + } + else { + logicalColumn += myTextRepresentationHelper.toVisualColumnSymbolsNumber(text, i, region.getEndOffset(), x); + } + foldingColumnDiff = visualColumn + visualFoldingPlaceholderWidth - logicalColumn - softWrapColumnDiff; + i = region.getEndOffset(); + } + } + + visualColumn += visualFoldingPlaceholderWidth; + x += visualFoldingPlaceholderWidth * myTextRepresentationHelper.charWidth(' ', x, Font.PLAIN); + if (visualLine == targetVisualPosition.line && visualColumn == targetVisualPosition.column) { + return build(); + } + return null; } /** @@ -560,31 +603,31 @@ public class SoftWrapDataMapper { } // Just update information about tracked symbols number if current visual line is too low. - if (targetVisualPosition.line > visualLineBeforeSoftWrapAppliance + targetSoftWrapLines) { + if (targetVisualPosition.line > visualLine) { int columnsForSymbol = toVisualColumnSymbolsNumber(c, x); - symbolsOnCurrentVisualLine += columnsForSymbol; - symbolsOnCurrentLogicalLine += columnsForSymbol; + visualColumn += columnsForSymbol; + logicalColumn += columnsForSymbol; x += myTextRepresentationHelper.charWidth(c, x, fontType); return null; } // There is a possible case that, for example, target visual column is zero. We shouldn't count symbols then. // Hence, we perform this preliminary examination with eager return if necessary. - if (targetVisualPosition.column <= symbolsOnCurrentVisualLine) { + if (targetVisualPosition.column <= visualColumn) { return build(); } int columnsForSymbol = toVisualColumnSymbolsNumber(c, x); - int diffInColumns = targetVisualPosition.column - symbolsOnCurrentVisualLine; + int diffInColumns = targetVisualPosition.column - visualColumn; int incrementToUse = columnsForSymbol; if (columnsForSymbol >= diffInColumns) { incrementToUse = Math.min(columnsForSymbol, diffInColumns); } - symbolsOnCurrentVisualLine += incrementToUse; - symbolsOnCurrentLogicalLine += incrementToUse; + visualColumn += incrementToUse; + logicalColumn += incrementToUse; x += myTextRepresentationHelper.charWidth(c, x, fontType); - if (targetVisualPosition.column <= symbolsOnCurrentVisualLine) { + if (targetVisualPosition.column <= visualColumn) { return build(); } else { @@ -593,22 +636,19 @@ public class SoftWrapDataMapper { } private LogicalPosition build() { - return build(symbolsOnCurrentVisualLine - symbolsOnCurrentLogicalLine); + return build(foldingColumnDiff); } - private LogicalPosition build(int softWrapColumnDiff) { - int logicalLine = softWrapUnawareLogicalPosition.line - softWrapLinesBefore - - softWrapLinesOnCurrentLineBeforeTargetSoftWrap - targetSoftWrapLines; - LogicalPosition foldingUnawareResult = new LogicalPosition( + private LogicalPosition build(int foldingColumnDiff) { + return new LogicalPosition( logicalLine, - symbolsOnCurrentLogicalLine, + logicalColumn, softWrapLinesBefore, softWrapLinesOnCurrentLineBeforeTargetSoftWrap + targetSoftWrapLines, softWrapColumnDiff, - 0, - 0 + foldedLines, + foldingColumnDiff ); - return adjustFoldingData(foldingModel, foldingUnawareResult); } } diff --git a/platform/platform-impl/testSrc/com/intellij/openapi/editor/impl/softwrap/SoftWrapDataMapperTest.java b/platform/platform-impl/testSrc/com/intellij/openapi/editor/impl/softwrap/SoftWrapDataMapperTest.java index a267c0716e2b..b65c3c88755c 100644 --- a/platform/platform-impl/testSrc/com/intellij/openapi/editor/impl/softwrap/SoftWrapDataMapperTest.java +++ b/platform/platform-impl/testSrc/com/intellij/openapi/editor/impl/softwrap/SoftWrapDataMapperTest.java @@ -201,9 +201,9 @@ public class SoftWrapDataMapperTest { String document = "public class Test {\n" + " public void foo(int[] data) {\n" + - " bar(data[0], data[1], data[2], data[3], \n" + - " data[4], data[5], data[6], \n" + - " data[7], data[8]); \n" + + " bar(data[0], \n" + + " data[1], \n" + + " data[2]); \n" + " }\n" + " public void bar(int ... i) {\n" + " }\n" + @@ -230,22 +230,52 @@ public class SoftWrapDataMapperTest { test(document); } + @Test + public void softWrappedSingleLineFolding() { + String document = + "class Test {\n" + + " public void foo() {} \n" + + " \n" + + "}"; + test(document); + } + + @Test + public void softWrappedMultiLineLineFolding() { + String document = + "class Test {\n" + + " public void foo() {\n" + + " } \n" + + "}"; + test(document); + } + + @Test + public void multipleFoldRegionsAfterSingleSoftWrap() { + String document = + "class Test {\n" + + " public void foo() {\n" + + " } // comment \n" + + "}"; + test(document); + } + @Test public void softWrapAndFoldedLines() { String document = "public class Test {\n" + " public void foo(int[] data) {\n" + - " bar(data[0], data[1], \n" + - " data[2], data[3], \n" + - " data[4], data[5], \n" + - " data[6], data[7], \n" + - " data[8], data[9], \n" + - " data[10], data[11], \n" + - " data[12], data[13], \n" + - " data[14], data[15], \n" + - " data[16], data[17], \n" + - " data[18], data[19], \n" + - " data[20], data[21]); \n" + + " bar(data[0] \n" + + " data[1], \n" + + " data[2], \n" + + " data[3], \n" + + " data[4], \n" + + " data[5], \n" + + " data[6], \n" + + " data[7], \n" + + " data[8] \n" + + " data[9], \n" + + " data[10]); \n" + " }\n" + " public void bar(int ... i) {\n" + " }\n" + @@ -346,7 +376,7 @@ public class SoftWrapDataMapperTest { @Nullable private FoldRegion getCollapsedFoldRegion(int offset) { for (FoldRegion region : myFoldRegions) { - if (region.getStartOffset() == offset) { + if (region.getStartOffset() <= offset && region.getEndOffset() > offset) { return region; } } @@ -424,15 +454,15 @@ public class SoftWrapDataMapperTest { } // Check visual by logical. - VisualPosition actualVisual = myAdjuster.adjustVisualPosition(data.logical, toSoftWrapUnawareVisual(data)); - if (!actualVisual.equals(data.visual)) { - myAdjuster.adjustVisualPosition(data.logical, toSoftWrapUnawareVisual(data)); - throw new AssertionError( - String.format("Detected unmatched visual position by logical. Expected: '%s', actual: '%s'. Calculation was performed " - + "against logical position: '%s' and soft wrap-unaware visual: '%s'", - data.visual, actualVisual, data.logical, toSoftWrapUnawareVisual(data)) - ); - } + //VisualPosition actualVisual = myAdjuster.adjustVisualPosition(data.logical, toSoftWrapUnawareVisual(data)); + //if (!actualVisual.equals(data.visual)) { + // myAdjuster.adjustVisualPosition(data.logical, toSoftWrapUnawareVisual(data)); + // throw new AssertionError( + // String.format("Detected unmatched visual position by logical. Expected: '%s', actual: '%s'. Calculation was performed " + // + "against logical position: '%s' and soft wrap-unaware visual: '%s'", + // data.visual, actualVisual, data.logical, toSoftWrapUnawareVisual(data)) + // ); + //} } } @@ -471,7 +501,8 @@ public class SoftWrapDataMapperTest { continue; } - context.onNewSymbol(documentText.charAt(i)); + char c = documentText.charAt(i); + context.onNewSymbol(c); } myLineRanges.add(new TextRange(context.logicalLineStartOffset, context.document.length())); @@ -549,6 +580,7 @@ public class SoftWrapDataMapperTest { int softWrapLinesBeforeCurrentLogical; int softWrapLinesOnCurrentLogical; int softWrapSymbolsOnCurrentVisualLine; + int softWrapColumnDiff; int foldingStartOffset; int foldingStartLogicalColumn; int foldingStartVisualColumn; @@ -580,8 +612,9 @@ public class SoftWrapDataMapperTest { public void onFoldingEnd() { visualColumn += 3; // For '...' folding + foldingColumnDiff += 3; + x = foldingStartX + 3 * SPACE_SIZE; - foldingColumnDiff = visualColumn - logicalColumn; insideFolding = false; myFoldRegions.add(new MockFoldRegion(foldingStartOffset, offset)); } @@ -595,6 +628,10 @@ public class SoftWrapDataMapperTest { foldedLines++; offset++; x = 0; + softWrapColumnDiff = 0; + softWrapLinesBeforeCurrentLogical += softWrapLinesOnCurrentLogical; + softWrapLinesOnCurrentLogical = 0; + foldingColumnDiff = foldingStartVisualColumn; } else if (c == '\t') { int tabWidthInColumns = myRepresentationHelper.toVisualColumnSymbolsNumber(c, x); @@ -611,12 +648,13 @@ public class SoftWrapDataMapperTest { logicalColumn++; offset++; + foldingColumnDiff -= tabWidthInColumns; } else { logicalColumn++; offset++; x += myRepresentationHelper.charWidth(c, x, Font.PLAIN); + foldingColumnDiff--; } - foldingColumnDiff = foldingStartVisualColumn - logicalColumn; return; } @@ -627,20 +665,25 @@ public class SoftWrapDataMapperTest { // Emulate the situation when the user works with a virtual space after document line end (add such virtual // positions two symbols behind the end). visualColumn++; + softWrapColumnDiff++; x += SPACE_SIZE; addData(true); + visualColumn++; + softWrapColumnDiff++; x += SPACE_SIZE; addData(true); visualLine++; x = 0; softWrapLinesOnCurrentLogical++; + softWrapColumnDiff = -logicalColumn + 1; visualColumn = 1; // For the column reserved for soft wrap sign. softWrapSymbolsOnCurrentVisualLine = 0; } else { visualColumn++; + softWrapColumnDiff++; softWrapSymbolsOnCurrentVisualLine++; x += myRepresentationHelper.charWidth(c, x, Font.PLAIN); } @@ -652,6 +695,8 @@ public class SoftWrapDataMapperTest { if (c == '\n') { visualLine++; visualColumn = 0; + foldingColumnDiff = 0; + softWrapColumnDiff = 0; x = 0; softWrapLinesBeforeCurrentLogical += softWrapLinesOnCurrentLogical; softWrapLinesOnCurrentLogical = 0; @@ -719,7 +764,6 @@ public class SoftWrapDataMapperTest { private LogicalPosition buildLogicalPosition() { //int softWrapColumnDiff - int softWrapColumnDiff = visualColumn - logicalColumn - foldingColumnDiff; return new LogicalPosition( logicalLine, logicalColumn, softWrapLinesBeforeCurrentLogical, softWrapLinesOnCurrentLogical, softWrapColumnDiff, foldedLines, foldingColumnDiff From d6e75fa029acb533cc2865378ca65947ff96828e Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 29 Jul 2010 14:42:53 +0400 Subject: [PATCH 63/82] fix tooltip and context menu on traffic light renderer --- .../openapi/editor/impl/EditorMarkupModelImpl.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java index 5c1eed0ba99d..405de6210f6f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java @@ -583,10 +583,12 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark private class MyErrorPanel extends ButtonlessScrollBarUI implements MouseMotionListener, MouseListener { private PopupHandler myHandler; + private ErrorStripeButton myErrorStripeButton; @Override protected JButton createDecreaseButton(int orientation) { - return new ErrorStripeButton(); + myErrorStripeButton = new ErrorStripeButton(); + return myErrorStripeButton; } @Override @@ -594,12 +596,16 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark super.installListeners(); scrollbar.addMouseMotionListener(this); scrollbar.addMouseListener(this); + myErrorStripeButton.addMouseMotionListener(this); + myErrorStripeButton.addMouseListener(this); } @Override protected void uninstallListeners() { scrollbar.removeMouseMotionListener(this); scrollbar.removeMouseListener(this); + myErrorStripeButton.removeMouseMotionListener(this); + myErrorStripeButton.removeMouseListener(this); super.uninstallListeners(); } @@ -735,10 +741,12 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark public void setPopupHandler(final PopupHandler handler) { if (myHandler != null) { scrollbar.removeMouseListener(myHandler); + myErrorStripeButton.removeMouseListener(myHandler); } myHandler = handler; scrollbar.addMouseListener(handler); + myErrorStripeButton.addMouseListener(myHandler); } } From 65acd5b39f34f12a73ac0f9ac5f402a00bba104f Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 29 Jul 2010 15:20:27 +0400 Subject: [PATCH 64/82] delete some unused code --- .../daemon/impl/ImportPopupHectorComponentProvider.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/ImportPopupHectorComponentProvider.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/ImportPopupHectorComponentProvider.java index f97554baf623..1b195687538b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/ImportPopupHectorComponentProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/ImportPopupHectorComponentProvider.java @@ -21,7 +21,6 @@ package com.intellij.codeInsight.daemon.impl; import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; -import com.intellij.lang.Language; import com.intellij.openapi.editor.EditorBundle; import com.intellij.openapi.editor.HectorComponentPanel; import com.intellij.openapi.editor.HectorComponentPanelsProvider; @@ -30,13 +29,11 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.FileViewProvider; import com.intellij.psi.PsiFile; import com.intellij.util.ui.DialogUtil; import org.jetbrains.annotations.NotNull; import javax.swing.*; -import java.util.Set; public class ImportPopupHectorComponentProvider implements HectorComponentPanelsProvider { @@ -48,8 +45,6 @@ public class ImportPopupHectorComponentProvider implements HectorComponentPanels assert virtualFile != null; final boolean notInLibrary = !fileIndex.isInLibrarySource(virtualFile) && !fileIndex.isInLibraryClasses(virtualFile) || fileIndex.isInContent(virtualFile); - final FileViewProvider viewProvider = file.getViewProvider(); - final Set languages = viewProvider.getLanguages(); return new HectorComponentPanel() { private JCheckBox myImportPopupCheckBox = new JCheckBox(EditorBundle.message("hector.import.popup.checkbox")); From 50e4076e5c7a48eff46784ee585056eabbd74f76 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 29 Jul 2010 15:44:31 +0400 Subject: [PATCH 65/82] 'power save mode' option (turns off daemon code analyzer) --- .../daemon/PowerSaveHectorProvider.java | 61 +++++++++++++++++++ .../daemon/impl/DaemonCodeAnalyzerImpl.java | 2 + .../daemon/impl/DaemonListeners.java | 8 +++ .../daemon/impl/TrafficLightRenderer.java | 10 ++- .../src/com/intellij/ide/PowerSaveMode.java | 50 +++++++++++++++ .../ide/actions/TogglePowerSaveAction.java | 36 +++++++++++ .../wm/impl/status/TogglePopupHintsPanel.java | 29 +++++++-- .../src/messages/ActionsBundle.properties | 2 + .../src/META-INF/LangExtensions.xml | 5 ++ .../src/idea/LangActions.xml | 6 ++ .../highlighting/DomElementsErrorPanel.java | 2 +- 11 files changed, 202 insertions(+), 9 deletions(-) create mode 100644 platform/lang-impl/src/com/intellij/codeInsight/daemon/PowerSaveHectorProvider.java create mode 100644 platform/lang-impl/src/com/intellij/ide/PowerSaveMode.java create mode 100644 platform/lang-impl/src/com/intellij/ide/actions/TogglePowerSaveAction.java diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/PowerSaveHectorProvider.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/PowerSaveHectorProvider.java new file mode 100644 index 000000000000..47ba565f8fa3 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/PowerSaveHectorProvider.java @@ -0,0 +1,61 @@ +/* + * Copyright 2000-2010 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.codeInsight.daemon; + +import com.intellij.ide.PowerSaveMode; +import com.intellij.openapi.editor.HectorComponentPanel; +import com.intellij.openapi.editor.HectorComponentPanelsProvider; +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; + +/** + * @author yole + */ +public class PowerSaveHectorProvider implements HectorComponentPanelsProvider { + @Override + public HectorComponentPanel createConfigurable(@NotNull PsiFile file) { + return new HectorComponentPanel() { + private JCheckBox myCheckBox = new JCheckBox("Power Save Mode"); + + @Override + public JComponent createComponent() { + return myCheckBox; + } + + @Override + public boolean isModified() { + return myCheckBox.isSelected() != PowerSaveMode.isEnabled(); + } + + @Override + public void apply() throws ConfigurationException { + PowerSaveMode.setEnabled(myCheckBox.isSelected()); + } + + @Override + public void reset() { + myCheckBox.setSelected(PowerSaveMode.isEnabled()); + } + + @Override + public void disposeUIResources() { + } + }; + } +} diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java index 6c14fadc30d7..ee6d27286d48 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java @@ -27,6 +27,7 @@ import com.intellij.codeInsight.daemon.ReferenceImporter; import com.intellij.codeInsight.hint.HintManager; import com.intellij.codeInsight.intention.impl.IntentionHintComponent; import com.intellij.concurrency.Job; +import com.intellij.ide.PowerSaveMode; import com.intellij.lang.annotation.HighlightSeverity; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; @@ -586,6 +587,7 @@ public class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzer implements JDOMEx return new Runnable() { public void run() { if (!myUpdateByTimerEnabled) return; + if (PowerSaveMode.isEnabled()) return; if (myDisposed || myProject.isDisposed()) return; final Collection activeEditors = myDaemonListeners.getSelectedEditors(); if (activeEditors.isEmpty()) return; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java index aa1bc32786e2..b3561b6bd82c 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java @@ -19,6 +19,7 @@ package com.intellij.codeInsight.daemon.impl; import com.intellij.ProjectTopics; import com.intellij.codeHighlighting.Pass; import com.intellij.codeInsight.hint.TooltipController; +import com.intellij.ide.PowerSaveMode; import com.intellij.ide.todo.TodoConfiguration; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; @@ -195,6 +196,13 @@ public class DaemonListeners implements Disposable { } }); + connection.subscribe(PowerSaveMode.TOPIC, new PowerSaveMode.Listener() { + @Override + public void powerSaveStateChanged() { + stopDaemon(true); + } + }); + CommandProcessor.getInstance().addCommandListener(new MyCommandListener(), this); ApplicationManager.getApplication().addApplicationListener(myApplicationListener); EditorColorsManager.getInstance().addEditorColorsListener(myEditorColorsListener); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/TrafficLightRenderer.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/TrafficLightRenderer.java index aa603832d71e..29281a4f3042 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/TrafficLightRenderer.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/TrafficLightRenderer.java @@ -20,6 +20,7 @@ import com.intellij.codeHighlighting.HighlightDisplayLevel; import com.intellij.codeHighlighting.TextEditorHighlightingPass; import com.intellij.codeInsight.daemon.DaemonBundle; import com.intellij.codeInsight.daemon.impl.analysis.HighlightLevelUtil; +import com.intellij.ide.PowerSaveMode; import com.intellij.lang.annotation.HighlightSeverity; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.markup.ErrorStripeRenderer; @@ -109,7 +110,7 @@ public class TrafficLightRenderer implements ErrorStripeRenderer { final SeverityRegistrar severityRegistrar = SeverityRegistrar.getInstance(myProject); status.errorCount = new int[severityRegistrar.getSeveritiesCount()]; status.rootsNumber = roots.length; - fillDaemonCodeAnalyzerErrorsSatus(status, fillErrorsCount); + fillDaemonCodeAnalyzerErrorsStatus(status, fillErrorsCount); List passes = myDaemonCodeAnalyzer.getPassesToShowProgressFor(myFile); ArrayList passStati = new ArrayList(); for (TextEditorHighlightingPass tepass : passes) { @@ -127,7 +128,7 @@ public class TrafficLightRenderer implements ErrorStripeRenderer { return status; } - protected void fillDaemonCodeAnalyzerErrorsSatus(DaemonCodeAnalyzerStatus status, boolean fillErrorsCount) { + protected void fillDaemonCodeAnalyzerErrorsStatus(DaemonCodeAnalyzerStatus status, boolean fillErrorsCount) { final SeverityRegistrar severityRegistrar = SeverityRegistrar.getInstance(myProject); List highlights = DaemonCodeAnalyzerImpl.getHighlights(myDocument, myProject); if (highlights == null) highlights = Arrays.asList(HighlightInfo.EMPTY_ARRAY); @@ -185,6 +186,11 @@ public class TrafficLightRenderer implements ErrorStripeRenderer { if (status == null) return null; @NonNls String text = HTML_HEADER; + if (PowerSaveMode.isEnabled()) { + text += "Code analysis is disabled in power save mode."; + text += HTML_FOOTER; + return text; + } if (status.noHighlightingRoots != null && status.noHighlightingRoots.length == status.rootsNumber) { text += DaemonBundle.message("analysis.hasnot.been.run"); text += HTML_FOOTER; diff --git a/platform/lang-impl/src/com/intellij/ide/PowerSaveMode.java b/platform/lang-impl/src/com/intellij/ide/PowerSaveMode.java new file mode 100644 index 000000000000..5b0d27dd3831 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/ide/PowerSaveMode.java @@ -0,0 +1,50 @@ +/* + * Copyright 2000-2010 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.ide; + +import com.intellij.openapi.components.ServiceManager; +import com.intellij.util.messages.MessageBus; +import com.intellij.util.messages.Topic; + +/** + * @author yole + */ +public class PowerSaveMode { + private boolean myEnabled = false; + private final MessageBus myBus; + + public PowerSaveMode(MessageBus bus) { + myBus = bus; + } + + public static boolean isEnabled() { + return ServiceManager.getService(PowerSaveMode.class).myEnabled; + } + + public static void setEnabled(boolean value) { + final PowerSaveMode instance = ServiceManager.getService(PowerSaveMode.class); + if (instance.myEnabled != value) { + instance.myEnabled = value; + instance.myBus.syncPublisher(TOPIC).powerSaveStateChanged(); + } + } + + public interface Listener { + void powerSaveStateChanged(); + } + + public static Topic TOPIC = Topic.create("PowerSaveMode.Listener", Listener.class); +} diff --git a/platform/lang-impl/src/com/intellij/ide/actions/TogglePowerSaveAction.java b/platform/lang-impl/src/com/intellij/ide/actions/TogglePowerSaveAction.java new file mode 100644 index 000000000000..3040982f253b --- /dev/null +++ b/platform/lang-impl/src/com/intellij/ide/actions/TogglePowerSaveAction.java @@ -0,0 +1,36 @@ +/* + * Copyright 2000-2010 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.ide.actions; + +import com.intellij.ide.PowerSaveMode; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.ToggleAction; +import com.intellij.openapi.project.DumbAware; + +/** + * @author yole + */ +public class TogglePowerSaveAction extends ToggleAction implements DumbAware { + @Override + public boolean isSelected(AnActionEvent e) { + return PowerSaveMode.isEnabled(); + } + + @Override + public void setSelected(AnActionEvent e, boolean state) { + PowerSaveMode.setEnabled(state); + } +} diff --git a/platform/lang-impl/src/com/intellij/openapi/wm/impl/status/TogglePopupHintsPanel.java b/platform/lang-impl/src/com/intellij/openapi/wm/impl/status/TogglePopupHintsPanel.java index fe8dfa478269..2449862dfd81 100644 --- a/platform/lang-impl/src/com/intellij/openapi/wm/impl/status/TogglePopupHintsPanel.java +++ b/platform/lang-impl/src/com/intellij/openapi/wm/impl/status/TogglePopupHintsPanel.java @@ -20,6 +20,7 @@ import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; import com.intellij.codeInsight.daemon.impl.HectorComponent; import com.intellij.codeInsight.daemon.impl.analysis.HighlightLevelUtil; import com.intellij.ide.DataManager; +import com.intellij.ide.PowerSaveMode; import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileEditorManager; @@ -38,6 +39,7 @@ import com.intellij.psi.PsiManager; import com.intellij.ui.UIBundle; import com.intellij.ui.awt.RelativePoint; import com.intellij.util.Consumer; +import com.intellij.util.messages.MessageBusConnection; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -57,7 +59,8 @@ public class TogglePopupHintsPanel implements StatusBarWidget, StatusBarWidget.I public TogglePopupHintsPanel(@NotNull final Project project) { myCurrentIcon = EMPTY_ICON; - project.getMessageBus().connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new FileEditorManagerAdapter() { + final MessageBusConnection connection = project.getMessageBus().connect(); + connection.subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new FileEditorManagerAdapter() { @Override public void selectionChanged(FileEditorManagerEvent event) { updateStatus(); @@ -68,6 +71,12 @@ public class TogglePopupHintsPanel implements StatusBarWidget, StatusBarWidget.I updateStatus(); } }); + connection.subscribe(PowerSaveMode.TOPIC, new PowerSaveMode.Listener() { + @Override + public void powerSaveStateChanged() { + updateStatus(); + } + }); } public void dispose() { @@ -130,13 +139,21 @@ public class TogglePopupHintsPanel implements StatusBarWidget, StatusBarWidget.I private void updateStatus(PsiFile file) { if (isStateChangeable(file)) { - if (HighlightLevelUtil.shouldInspect(file)) { + if (PowerSaveMode.isEnabled()) { + myCurrentIcon = EMPTY_ICON; + myToolTipText = "Code analysis is disabled in power save mode. "; + } + else if (HighlightLevelUtil.shouldInspect(file)) { myCurrentIcon = INSPECTIONS_ICON; - myToolTipText = "Current inspection profile: " + InspectionProjectProfileManager.getInstance(file.getProject()).getInspectionProfile().getName() + ". "; - } else if (HighlightLevelUtil.shouldHighlight(file)) { + myToolTipText = "Current inspection profile: " + + InspectionProjectProfileManager.getInstance(file.getProject()).getInspectionProfile().getName() + + ". "; + } + else if (HighlightLevelUtil.shouldHighlight(file)) { myCurrentIcon = SYNTAX_ONLY_ICON; - myToolTipText = "Highlighting level is: Syntax. "; - } else { + myToolTipText = "Highlighting level is: Syntax. "; + } + else { myCurrentIcon = INSPECTIONS_OFF_ICON; myToolTipText = "Inspections are off. "; } diff --git a/platform/platform-resources-en/src/messages/ActionsBundle.properties b/platform/platform-resources-en/src/messages/ActionsBundle.properties index bb4a5d8623d7..67b7f3c15e8c 100644 --- a/platform/platform-resources-en/src/messages/ActionsBundle.properties +++ b/platform/platform-resources-en/src/messages/ActionsBundle.properties @@ -1171,3 +1171,5 @@ group.ToolsBasicGroup.description=Tools Basic Group group.ToolbarNewElement.text=Toolbar New Element Group action.NewElementToolbarAction.text=Create New File action.ShowRegistry.text=Registry +action.TogglePowerSave.text=Power Save Mode +action.TogglePowerSave.description=Power save mode disables background code analysis and other background operations diff --git a/platform/platform-resources/src/META-INF/LangExtensions.xml b/platform/platform-resources/src/META-INF/LangExtensions.xml index 49b97ae80a36..3356ef190496 100644 --- a/platform/platform-resources/src/META-INF/LangExtensions.xml +++ b/platform/platform-resources/src/META-INF/LangExtensions.xml @@ -128,6 +128,9 @@ + + @@ -568,4 +571,6 @@ + + diff --git a/platform/platform-resources/src/idea/LangActions.xml b/platform/platform-resources/src/idea/LangActions.xml index 077cba2d4153..1e24656bd38f 100644 --- a/platform/platform-resources/src/idea/LangActions.xml +++ b/platform/platform-resources/src/idea/LangActions.xml @@ -70,6 +70,12 @@ + + + + + + diff --git a/xml/dom-impl/src/com/intellij/util/xml/highlighting/DomElementsErrorPanel.java b/xml/dom-impl/src/com/intellij/util/xml/highlighting/DomElementsErrorPanel.java index 294ef8b0231d..90ad7cf85686 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/highlighting/DomElementsErrorPanel.java +++ b/xml/dom-impl/src/com/intellij/util/xml/highlighting/DomElementsErrorPanel.java @@ -162,7 +162,7 @@ public class DomElementsErrorPanel extends JPanel implements CommittablePanel, H } @Override - protected void fillDaemonCodeAnalyzerErrorsSatus(DaemonCodeAnalyzerStatus status, boolean fillErrorsCount) { + protected void fillDaemonCodeAnalyzerErrorsStatus(DaemonCodeAnalyzerStatus status, boolean fillErrorsCount) { for (int i = 0; i < status.errorCount.length; i++) { final HighlightSeverity minSeverity = SeverityRegistrar.getInstance(myProject).getSeverityByIndex(i); if (minSeverity == null) { From 6804d8a6ea8e881edc07570534d827bdc31c7d6b Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Thu, 29 Jul 2010 15:56:53 +0400 Subject: [PATCH 66/82] added completion of django template variables declared in with tag --- .../src/com/intellij/util/containers/CollectionFactory.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/platform/util/src/com/intellij/util/containers/CollectionFactory.java b/platform/util/src/com/intellij/util/containers/CollectionFactory.java index 7f5871ec8702..ff443bee65b5 100644 --- a/platform/util/src/com/intellij/util/containers/CollectionFactory.java +++ b/platform/util/src/com/intellij/util/containers/CollectionFactory.java @@ -60,6 +60,10 @@ public class CollectionFactory { return new HashSet(); } + public static HashMap hashMap() { + return new HashMap(); + } + public static LinkedHashMap linkedMap() { return new LinkedHashMap(); } From 952ff674a32e71d8d75de6f2297ec7eaea16adf1 Mon Sep 17 00:00:00 2001 From: Denis Zhdanov Date: Thu, 29 Jul 2010 16:09:38 +0400 Subject: [PATCH 67/82] IDEA-56352 Soft wrap: content of folded code is incorrectly displayed if it is wrapped; visual defects appear Checking for valid line number is corrected --- .../src/com/intellij/openapi/editor/impl/EditorImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index 7d1ecdca7eae..5a6be1d663df 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -1055,7 +1055,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi } } - if (logLine == 0) { + if (logLine <= 0) { lineStartOffset = 0; } else if (lineStartOffset < 0) { From c1dbbf34e8eb82fcc5fc87f3f2447a9466f6a43a Mon Sep 17 00:00:00 2001 From: nik Date: Thu, 29 Jul 2010 16:11:14 +0400 Subject: [PATCH 68/82] IDEA-56925: Remote debugging broken (linux, tomcat) --- .../src/com/intellij/execution/ui/ExecutionConsole.java | 5 ++--- .../com/intellij/execution/runners/RunContentBuilder.java | 2 +- .../src/com/intellij/debugger/ui/DebuggerContentInfo.java | 3 ++- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/platform/lang-api/src/com/intellij/execution/ui/ExecutionConsole.java b/platform/lang-api/src/com/intellij/execution/ui/ExecutionConsole.java index 4ea881f5d51c..9d554cb51776 100644 --- a/platform/lang-api/src/com/intellij/execution/ui/ExecutionConsole.java +++ b/platform/lang-api/src/com/intellij/execution/ui/ExecutionConsole.java @@ -16,13 +16,12 @@ package com.intellij.execution.ui; import com.intellij.openapi.ui.ComponentContainer; - -import javax.swing.*; +import org.jetbrains.annotations.NonNls; /** * @author Eugene Zhuravlev * Date: Apr 20, 2004 */ public interface ExecutionConsole extends ComponentContainer { - + @NonNls String CONSOLE_CONTENT_ID = "ConsoleContent"; } diff --git a/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java b/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java index 2e90764ca8aa..1e7cb1e4e884 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java @@ -157,7 +157,7 @@ public class RunContentBuilder implements LogConsoleManager, Disposable { } } - final Content consoleContent = ui.createContent("Console", console.getComponent(), "Console", + final Content consoleContent = ui.createContent(ExecutionConsole.CONSOLE_CONTENT_ID, console.getComponent(), "Console", IconLoader.getIcon("/debugger/console.png"), console.getPreferredFocusableComponent()); diff --git a/platform/xdebugger-api/src/com/intellij/debugger/ui/DebuggerContentInfo.java b/platform/xdebugger-api/src/com/intellij/debugger/ui/DebuggerContentInfo.java index 7d47bca9d67b..c43caa8dd139 100644 --- a/platform/xdebugger-api/src/com/intellij/debugger/ui/DebuggerContentInfo.java +++ b/platform/xdebugger-api/src/com/intellij/debugger/ui/DebuggerContentInfo.java @@ -15,11 +15,12 @@ */ package com.intellij.debugger.ui; +import com.intellij.execution.ui.ExecutionConsole; import org.jetbrains.annotations.NonNls; public interface DebuggerContentInfo { - @NonNls String CONSOLE_CONTENT = "ConsoleContent"; + @NonNls String CONSOLE_CONTENT = ExecutionConsole.CONSOLE_CONTENT_ID; @NonNls String THREADS_CONTENT = "ThreadsContent"; @NonNls String VARIABLES_CONTENT = "VariablesContent"; @NonNls String FRAME_CONTENT = "FrameContent"; From 5d2a334237cb4496091eaf3b8259ff3899db32c9 Mon Sep 17 00:00:00 2001 From: irengrig Date: Thu, 29 Jul 2010 16:18:00 +0400 Subject: [PATCH 69/82] IDEA-56714 IDEA 9.0.3 EAP builds (including 413) generate extensive amount of simultaneous SVN sessions/connections and don't close them --- .../src/org/jetbrains/idea/svn/SvnUtil.java | 8 ++++- .../svn/actions/CompareWithBranchAction.java | 13 +++++-- .../svn/config/SvnConfigureProxiesDialog.java | 9 ++++- .../idea/svn/dialogs/BranchMerger.java | 9 ++++- .../svn/dialogs/RepositoryBrowserDialog.java | 10 ++++-- .../svn/dialogs/SelectLocationDialog.java | 8 +++-- .../history/SvnCommittedChangesProvider.java | 35 +++++++++++++++---- .../svn/update/SvnIntegrateEnvironment.java | 10 ++++-- 8 files changed, 84 insertions(+), 18 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java index 5d2c0ae24082..4dc1cd824f24 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java @@ -616,11 +616,17 @@ public class SvnUtil { } public static boolean doesRepositorySupportMergeinfo(final SvnVcs vcs, final SVNURL url) { + SVNRepository repository = null; try { - return vcs.createRepository(url).hasCapability(SVNCapability.MERGE_INFO); + repository = vcs.createRepository(url); + return repository.hasCapability(SVNCapability.MERGE_INFO); } catch (SVNException e) { return false; + } finally { + if (repository != null) { + repository.closeSession(); + } } } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/CompareWithBranchAction.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/CompareWithBranchAction.java index f95e4eb46ef5..8a54444ffc19 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/CompareWithBranchAction.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/CompareWithBranchAction.java @@ -133,6 +133,8 @@ public class CompareWithBranchAction extends AnAction implements DumbAware { SVNWCAccess wcAccess = vcs.createWCAccess(); + SVNRepository repository = null; + SVNRepository repository2 = null; try { SVNAdminAreaInfo info = wcAccess.openAnchor(new File(myVirtualFile.getPath()), false, SVNWCAccess.INFINITE_DEPTH); File anchorPath = info.getAnchor().getRoot(); @@ -150,18 +152,25 @@ public class CompareWithBranchAction extends AnAction implements DumbAware { } SVNURL anchorURL = anchorEntry.getSVNURL(); - SVNRepository repository = vcs.createRepository(anchorURL.toString()); + repository = vcs.createRepository(anchorURL.toString()); SVNReporter reporter = new SVNReporter(info, info.getAnchor().getFile(info.getTargetName()), false, true, SVNDepth.INFINITY, false, false, true, SVNDebugLog.getDefaultLog()); long rev = repository.getLatestRevision(); + repository2 = vcs.createRepository((target == null) ? url.toString() : url.removePathTail().toString()); SvnDiffEditor diffEditor = new SvnDiffEditor((target == null) ? myVirtualFile : myVirtualFile.getParent(), - vcs.createRepository((target == null) ? url.toString() : url.removePathTail().toString()), rev, true); + repository2, rev, true); repository.diff(url, rev, rev, target, true, true, false, reporter, SVNCancellableEditor.newInstance(diffEditor, new SvnProgressCanceller(), null)); changes.addAll(diffEditor.getChangesMap().values()); } finally { wcAccess.close(); + if (repository != null) { + repository.closeSession(); + } + if (repository2 != null) { + repository2.closeSession(); + } } } catch(SVNCancelException ex) { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/config/SvnConfigureProxiesDialog.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/config/SvnConfigureProxiesDialog.java index 04f5fd461595..c41d23cd59c5 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/config/SvnConfigureProxiesDialog.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/config/SvnConfigureProxiesDialog.java @@ -27,6 +27,7 @@ import org.jetbrains.idea.svn.SvnConfiguration; import org.jetbrains.idea.svn.SvnServerFileManager; import org.jetbrains.idea.svn.SvnVcs; import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.io.SVNRepository; import javax.swing.*; import java.awt.*; @@ -137,10 +138,16 @@ public class SvnConfigureProxiesDialog extends DialogWrapper implements Validati if (pi != null) { pi.setText("Connecting to " + url); } + SVNRepository repository = null; try { - SvnVcs.getInstance(myProject).createRepository(url).testConnection(); + repository = SvnVcs.getInstance(myProject).createRepository(url); + repository.testConnection(); } catch (SVNException exc) { excRef.set(exc); + } finally { + if (repository != null) { + repository.closeSession(); + } } } }, "Test connection", true, myProject); diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/BranchMerger.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/BranchMerger.java index e842e3ea602a..bd6f96a3b02b 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/BranchMerger.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/BranchMerger.java @@ -23,6 +23,7 @@ import org.jetbrains.idea.svn.update.UpdateEventHandler; import org.tmatesoft.svn.core.SVNDepth; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; +import org.tmatesoft.svn.core.io.SVNRepository; import org.tmatesoft.svn.core.wc.SVNDiffClient; import org.tmatesoft.svn.core.wc.SVNDiffOptions; import org.tmatesoft.svn.core.wc.SVNRevision; @@ -55,11 +56,17 @@ public class BranchMerger implements IMerger { myBranchName = branchName; mySourceCopyRevision = sourceCopyRevision; myAtStart = true; + SVNRepository repository = null; try { - mySourceLatestRevision = myVcs.createRepository(mySourceUrl).getLatestRevision(); + repository = myVcs.createRepository(mySourceUrl); + mySourceLatestRevision = repository.getLatestRevision(); } catch (SVNException e) { mySourceLatestRevision = SVNRevision.HEAD.getNumber(); + } finally { + if (repository != null) { + repository.closeSession(); + } } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/RepositoryBrowserDialog.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/RepositoryBrowserDialog.java index 643064ad4fa8..0e7d36a4b242 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/RepositoryBrowserDialog.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/RepositoryBrowserDialog.java @@ -1099,10 +1099,13 @@ public class RepositoryBrowserDialog extends DialogWrapper { SVNRepository sourceRepository = myVCS.createRepository(sourceURL.toString()); sourceRepository.setCanceller(new SvnProgressCanceller()); SvnDiffEditor diffEditor; - final long rev = sourceRepository.getLatestRevision(); + final long rev; + SVNRepository targetRepository = null; try { + rev = sourceRepository.getLatestRevision(); // generate Map of path->Change - diffEditor = new SvnDiffEditor(sourceRepository, myVCS.createRepository(targetURL.toString()), -1, false); + targetRepository = myVCS.createRepository(targetURL.toString()); + diffEditor = new SvnDiffEditor(sourceRepository, targetRepository, -1, false); final ISVNEditor cancellableEditor = SVNCancellableEditor.newInstance(diffEditor, new SvnProgressCanceller(), null); sourceRepository.diff(targetURL, rev, rev, null, true, true, false, new ISVNReporterBaton() { public void report(ISVNReporter reporter) throws SVNException { @@ -1113,6 +1116,9 @@ public class RepositoryBrowserDialog extends DialogWrapper { } finally { sourceRepository.closeSession(); + if (targetRepository != null) { + targetRepository.closeSession(); + } } final String sourceTitle = SVNPathUtil.tail(sourceURL.toString()); final String targetTitle = SVNPathUtil.tail(targetURL.toString()); diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/SelectLocationDialog.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/SelectLocationDialog.java index 076135792f03..01186c0b1f3e 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/SelectLocationDialog.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/SelectLocationDialog.java @@ -120,12 +120,16 @@ public class SelectLocationDialog extends DialogWrapper { ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() { public void run() { + SVNRepository repos = null; try { - SVNRepository repos = SvnVcs.getInstance(project).createRepository(urlString); + repos = SvnVcs.getInstance(project).createRepository(urlString); result.set(repos.getRepositoryRoot(true)); - repos.closeSession(); } catch (SVNException e) { excRef.set(e); + } finally { + if (repos != null) { + repos.closeSession(); + } } } }, "Detecting repository root", true, project); diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnCommittedChangesProvider.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnCommittedChangesProvider.java index 9ff2b64db560..45e7114caedb 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnCommittedChangesProvider.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnCommittedChangesProvider.java @@ -184,13 +184,17 @@ public class SvnCommittedChangesProvider implements CachingCommittedChangesProvi } final String repositoryRoot; + SVNRepository repository = null; try { - final SVNRepository repository = myVcs.createRepository(svnLocation.getURL()); + repository = myVcs.createRepository(svnLocation.getURL()); repositoryRoot = repository.getRepositoryRoot(true).toString(); - repository.closeSession(); } catch (SVNException e) { throw new VcsException(e); + } finally { + if (repository != null) { + repository.closeSession(); + } } final ChangeBrowserSettings.Filter filter = settings.createFilter(); @@ -219,13 +223,18 @@ public class SvnCommittedChangesProvider implements CachingCommittedChangesProvi } final String repositoryRoot; + SVNRepository repository = null; try { - final SVNRepository repository = myVcs.createRepository(svnLocation.getURL()); + repository = myVcs.createRepository(svnLocation.getURL()); repositoryRoot = repository.getRepositoryRoot(true).toString(); repository.closeSession(); } catch (SVNException e) { throw new VcsException(e); + } finally { + if (repository != null) { + repository.closeSession(); + } } getCommittedChangesImpl(settings, svnLocation.getURL(), new String[]{""}, maxCount, new Consumer() { @@ -249,13 +258,17 @@ public class SvnCommittedChangesProvider implements CachingCommittedChangesProvi } final String repositoryRoot; + SVNRepository repository = null; try { - final SVNRepository repository = myVcs.createRepository(svnLocation.getURL()); + repository = myVcs.createRepository(svnLocation.getURL()); repositoryRoot = repository.getRepositoryRoot(true).toString(); - repository.closeSession(); } catch (SVNException e) { throw new VcsException(e); + } finally { + if (repository != null) { + repository.closeSession(); + } } final MergeTrackerProxy proxy = new MergeTrackerProxy(new Consumer>() { @@ -356,7 +369,17 @@ public class SvnCommittedChangesProvider implements CachingCommittedChangesProvi revisionBefore = SVNRevision.create(changeTo.longValue()); } else { - revisionBefore = SVNRevision.create(myVcs.createRepository(url).getLatestRevision()); + SVNRepository repository = null; + final long revision; + try { + repository = myVcs.createRepository(url); + revision = repository.getLatestRevision(); + } finally { + if (repository != null) { + repository.closeSession(); + } + } + revisionBefore = SVNRevision.create(revision); } final SVNRevision revisionAfter; if (dateFrom != null) { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/update/SvnIntegrateEnvironment.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/update/SvnIntegrateEnvironment.java index af66563a46c5..11d5c124c53b 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/update/SvnIntegrateEnvironment.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/update/SvnIntegrateEnvironment.java @@ -20,10 +20,10 @@ import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.update.UpdatedFiles; +import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.svn.SvnBundle; import org.jetbrains.idea.svn.SvnConfiguration; import org.jetbrains.idea.svn.SvnVcs; -import org.jetbrains.annotations.Nullable; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.io.SVNRepository; @@ -131,14 +131,18 @@ public class SvnIntegrateEnvironment extends AbstractSvnUpdateIntegrateEnvironme } else { + SVNRepository repos = null; try { - SVNRepository repos = myVcs.createRepository(svnURL2.toString()); + repos = myVcs.createRepository(svnURL2.toString()); final long latestRev = repos.getLatestRevision(); - repos.closeSession(); return String.valueOf(latestRev); } catch (SVNException e) { return null; + } finally { + if (repos != null) { + repos.closeSession(); + } } } } From 250a89acb568b81123c24c561926ba3abe2002f1 Mon Sep 17 00:00:00 2001 From: Denis Zhdanov Date: Thu, 29 Jul 2010 16:49:55 +0400 Subject: [PATCH 70/82] IDEA-56352 Soft wrap: content of folded code is incorrectly displayed if it is wrapped; visual defects appear Provided handling of the situation when visual position line is more than total number of document lines --- .../openapi/editor/impl/softwrap/SoftWrapDataMapper.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/SoftWrapDataMapper.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/SoftWrapDataMapper.java index 8aa093783ce5..99cd59788f5f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/SoftWrapDataMapper.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/SoftWrapDataMapper.java @@ -192,6 +192,11 @@ public class SoftWrapDataMapper { // If we are here that means that there is no soft wrap on a logical line that corresponds to the target visual line. softWrapLinesBeforeCurrentLogicalLine += softWrapLinesOnCurrentLogicalLine; int logicalLine = defaultLogical.line - softWrapLinesBeforeCurrentLogicalLine; + // There is a possible case that we can't count on given default logical position - e.g. if given visual position line + // is more than total document lines count. + if (logicalLine < 0) { + logicalLine = Math.min(lastSoftWrapLogicalLine + 1, document.getLineCount() - 1); + } int foldedLines = getFoldedLinesBefore(document.getLineStartOffset(logicalLine)); int foldingColumnDiff = visual.column - defaultLogical.column; return new LogicalPosition( From 12fa9480e9574f6632a9a8efada4f3377616dd72 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 29 Jul 2010 13:59:01 +0100 Subject: [PATCH 71/82] fix many methods reported as unused: in the optimized search world the first of the two merged queries may be satisfied only when the second one is running. Unfortunately --- platform/util/src/com/intellij/util/MergeQuery.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/platform/util/src/com/intellij/util/MergeQuery.java b/platform/util/src/com/intellij/util/MergeQuery.java index ffeeed377d57..1f221aa3e10d 100644 --- a/platform/util/src/com/intellij/util/MergeQuery.java +++ b/platform/util/src/com/intellij/util/MergeQuery.java @@ -38,15 +38,14 @@ public class MergeQuery implements Query{ @NotNull public Collection findAll() { List results = new ArrayList(); - results.addAll(myQuery1.findAll()); - results.addAll(myQuery2.findAll()); + forEach(new CommonProcessors.CollectProcessor(results)); return results; } public T findFirst() { - final T r1 = myQuery1.findFirst(); - if (r1 != null) return r1; - return myQuery2.findFirst(); + final CommonProcessors.FindFirstProcessor processor = new CommonProcessors.FindFirstProcessor(); + forEach(processor); + return processor.getFoundValue(); } public boolean forEach(@NotNull final Processor consumer) { From e49dfcedae4c38776c318eee96d9354c1d4e42f2 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Thu, 29 Jul 2010 18:23:44 +0400 Subject: [PATCH 72/82] mark files for recompilation in "finally" block --- .../intellij/compiler/impl/CompileDriver.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) 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 9be9f12406dd..b3a7fb1ce535 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java @@ -959,10 +959,10 @@ public class CompileDriver { final TranslatorsOutputSink sink = new TranslatorsOutputSink(context, translators); final Set generatedTypes = new HashSet(); Collection chunkFiles = chunkMap.get(currentChunk); + final Set filesToRecompile = new HashSet(); + final Set allDependent = new HashSet(); try { int round = 0; - final Set filesToRecompile = new HashSet(); - final Set allDependent = new HashSet(); Collection dependentFiles = Collections.emptyList(); final Function>, Pair>> dependencyFilter = new DependentClassesCumulativeFilter(); @@ -1092,19 +1092,18 @@ public class CompileDriver { indicator.popState(); } } - - if (context.getMessageCount(CompilerMessageCategory.ERROR) != 0) { - filesToRecompile.addAll(allDependent); - } - if (filesToRecompile.size() > 0) { - sink.add(null, Collections.emptyList(), VfsUtil.toVirtualFileArray(filesToRecompile)); - } } catch (CacheCorruptedException e) { LOG.info(e); context.requestRebuildNextTime(e.getMessage()); } finally { + if (context.getMessageCount(CompilerMessageCategory.ERROR) != 0) { + filesToRecompile.addAll(allDependent); + } + if (filesToRecompile.size() > 0) { + sink.add(null, Collections.emptyList(), VfsUtil.toVirtualFileArray(filesToRecompile)); + } if (context.getMessageCount(CompilerMessageCategory.ERROR) == 0) { // perform update only if there were no errors, so it is guaranteed that the file was processd by all neccesary compilers sink.flushPostponedItems(); From f08ad9c2a485b58bababd972ef83f61b33f16dbc Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Thu, 29 Jul 2010 18:45:52 +0400 Subject: [PATCH 73/82] CIDR-18 --- .../com/intellij/ide/util/gotoByName/GotoSymbolModel2.java | 4 ++-- platform/util/src/com/intellij/psi/codeStyle/NameUtil.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoSymbolModel2.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoSymbolModel2.java index 376febce1227..f7244901207d 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoSymbolModel2.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoSymbolModel2.java @@ -70,11 +70,11 @@ public class GotoSymbolModel2 extends ContributorsBasedGotoByModel { @NotNull public String[] getSeparators() { - return new String[] {".", ":"}; + return new String[] {"."}; } @Override public String getHelpId() { return "procedures.navigating.goto.class"; } -} \ No newline at end of file +} diff --git a/platform/util/src/com/intellij/psi/codeStyle/NameUtil.java b/platform/util/src/com/intellij/psi/codeStyle/NameUtil.java index bcc8d62e5524..05e1ac36c5f9 100644 --- a/platform/util/src/com/intellij/psi/codeStyle/NameUtil.java +++ b/platform/util/src/com/intellij/psi/codeStyle/NameUtil.java @@ -198,7 +198,7 @@ public class NameUtil { firstIdentifierLetter = true; } else { - if (prevIsUppercase) { + if (c == ':' || prevIsUppercase) { buffer.append("[A-Za-z\\s0-9\\$]*"); } From 59f34de194f3e57c1fa271099f114a58fa9d7238 Mon Sep 17 00:00:00 2001 From: Denis Zhdanov Date: Thu, 29 Jul 2010 18:53:51 +0400 Subject: [PATCH 74/82] IDEA-56346 Soft wrap: Throwable at CaretModelImpl.moveToOffset() on editor resizing Caret cursor position is preserved during editor resizing now --- .../editor/ex/SoftWrapChangeListener.java | 7 ++++ .../openapi/editor/impl/EditorImpl.java | 41 ++++++++++--------- .../impl/softwrap/SoftWrapsStorage.java | 16 +++++--- 3 files changed, 40 insertions(+), 24 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/SoftWrapChangeListener.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/SoftWrapChangeListener.java index 281334ff0b52..32c638e61410 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/SoftWrapChangeListener.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/SoftWrapChangeListener.java @@ -18,6 +18,8 @@ package com.intellij.openapi.editor.ex; import com.intellij.openapi.editor.TextChange; import org.jetbrains.annotations.NotNull; +import java.util.Collection; + /** * Defines a contract for the callbacks for soft wraps management notifications (addition/removal). * @@ -32,4 +34,9 @@ public interface SoftWrapChangeListener { * @param softWrap newly registered soft wrap */ void softWrapAdded(@NotNull TextChange softWrap); + + /** + * This method is assumed to be called every time soft wrap(s) is removed. + */ + void softWrapsRemoved(); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index 5a6be1d663df..122d1f28fcca 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -334,6 +334,12 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi int softWrapLine = myDocument.getLineNumber(softWrap.getStart()); mySizeContainer.update(softWrapLine, softWrapLine, softWrapLine); } + + @Override + public void softWrapsRemoved() { + mySoftWrapsChanged = true; + mySizeContainer.reset(); + } }); EditorHighlighter highlighter = new EmptyEditorHighlighter(myScheme.getAttributes(HighlighterColors.TEXT)); @@ -1691,25 +1697,6 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi if (lIterator.getLineNumber() >= lastLineIndex && position.y <= clip.y + clip.height) { paintAfterFileEndBackground(iterationState, g, position, clip, lineHeight, defaultBackground); } - - // Perform additional activity if soft wrap is added or removed during repainting. - // Note: this code lives in this method in assumption that background repainting is the very first activity performed - // during whole editor component repaint. - if (mySoftWrapsChanged) { - mySoftWrapsChanged = false; - validateSize(); - - // Repaint editor to the bottom in order to ensure that its content is shown correctly after new soft wrap introduction. - repaintToScreenBottom(xyToLogicalPosition(position).line); - - // Repaint gutter at all space that is located after active clip in order to ensure that line numbers are correctly redrawn - // in accordance with the newly introduced soft wrap(s). - myGutterComponent.repaint(0, clip.y, myGutterComponent.getWidth(), myGutterComponent.getHeight() - clip.y); - - // Ask caret model to update visual caret position. - //TODO den implement - //getCaretModel().moveToOffset(getCaretModel().getOffset()); - } } private void paintRectangularSelection(Graphics g) { @@ -1908,6 +1895,22 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi } flushCachedChars(g); + + // Perform additional activity if soft wrap is added or removed during repainting. + if (mySoftWrapsChanged) { + mySoftWrapsChanged = false; + validateSize(); + + // Repaint editor to the bottom in order to ensure that its content is shown correctly after new soft wrap introduction. + repaintToScreenBottom(xyToLogicalPosition(position).line); + + // Repaint gutter at all space that is located after active clip in order to ensure that line numbers are correctly redrawn + // in accordance with the newly introduced soft wrap(s). + myGutterComponent.repaint(0, clip.y, myGutterComponent.getWidth(), myGutterComponent.getHeight() - clip.y); + + // Ask caret model to update visual caret position. + getCaretModel().moveToOffset(getCaretModel().getOffset()); + } } private boolean paintSelection() { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/SoftWrapsStorage.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/SoftWrapsStorage.java index 627a5ed6ae4e..14a7def3ebe3 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/SoftWrapsStorage.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/SoftWrapsStorage.java @@ -19,10 +19,7 @@ import com.intellij.openapi.editor.ex.SoftWrapChangeListener; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.concurrent.CopyOnWriteArraySet; /** @@ -125,7 +122,9 @@ public class SoftWrapsStorage { if (index < 0 || index >= myWraps.size()) { return null; } - return myWraps.remove(index); + TextChangeImpl removed = myWraps.remove(index); + notifyListenersAboutRemoval(); + return removed; } /** @@ -133,6 +132,7 @@ public class SoftWrapsStorage { */ public void removeAll() { myWraps.clear(); + notifyListenersAboutRemoval(); } /** @@ -144,4 +144,10 @@ public class SoftWrapsStorage { public boolean addSoftWrapChangeListener(@NotNull SoftWrapChangeListener listener) { return myListeners.add(listener); } + + private void notifyListenersAboutRemoval() { + for (SoftWrapChangeListener listener : myListeners) { + listener.softWrapsRemoved(); + } + } } From 127387fa3e9103e3900b30af2910654072d0df19 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Thu, 29 Jul 2010 18:57:30 +0400 Subject: [PATCH 75/82] maybe fix for TreeUiTest.testClear --- .../ide/util/treeView/AbstractTreeBuilderTest.java | 2 +- .../testSrc/com/intellij/ide/util/treeView/TreeUiTest.java | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/AbstractTreeBuilderTest.java b/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/AbstractTreeBuilderTest.java index b7e7346373cc..7dde8d515dc6 100644 --- a/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/AbstractTreeBuilderTest.java +++ b/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/AbstractTreeBuilderTest.java @@ -278,7 +278,7 @@ abstract class AbstractTreeBuilderTest extends BaseTreeTestCase Date: Thu, 29 Jul 2010 20:17:09 +0400 Subject: [PATCH 76/82] ViewOfflineInspection near run CodeInspectionAction --- .../platform-resources/src/idea/PlatformLangActionManager.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/platform-resources/src/idea/PlatformLangActionManager.xml b/platform/platform-resources/src/idea/PlatformLangActionManager.xml index 029bc11e134b..48ce2e847d23 100644 --- a/platform/platform-resources/src/idea/PlatformLangActionManager.xml +++ b/platform/platform-resources/src/idea/PlatformLangActionManager.xml @@ -51,6 +51,7 @@ + From deadf38a44e70b7496f67f8a5d1a6dfddddf85e9 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 29 Jul 2010 21:03:17 +0400 Subject: [PATCH 77/82] fix compilation of sample plugin; cleanup --- .../ComparingReferencesInspection.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/samples/comparingReferences/source/com/intellij/codeInspection/ComparingReferencesInspection.java b/samples/comparingReferences/source/com/intellij/codeInspection/ComparingReferencesInspection.java index 5532b0b6e44a..4c99465a2176 100644 --- a/samples/comparingReferences/source/com/intellij/codeInspection/ComparingReferencesInspection.java +++ b/samples/comparingReferences/source/com/intellij/codeInspection/ComparingReferencesInspection.java @@ -3,6 +3,7 @@ package com.intellij.codeInspection; import com.intellij.codeInsight.daemon.GroupNames; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Ref; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; import com.intellij.ui.DocumentAdapter; @@ -78,7 +79,7 @@ public class ComparingReferencesInspection extends BaseJavaLocalInspectionTool { private ProblemDescriptor[] analyzeCode(PsiElement where, final InspectionManager manager) { if (where == null) return null; - final ArrayList[] problemList = new ArrayList[]{null}; + final Ref> problemList = new Ref>(); where.accept(new JavaRecursiveElementWalkingVisitor() { @Override public void visitMethod(PsiMethod method) {} @@ -96,18 +97,18 @@ public class ComparingReferencesInspection extends BaseJavaLocalInspectionTool { PsiType rType = rOperand.getType(); if (isCheckedType(lType) || isCheckedType(rType)) { - if (problemList[0] == null) problemList[0] = new ArrayList(); - problemList[0].add(manager.createProblemDescriptor(expression, DESCRIPTION_TEMPLATE, + if (problemList.get() == null) problemList.set(new ArrayList()); + problemList.get().add(manager.createProblemDescriptor(expression, DESCRIPTION_TEMPLATE, myQuickFix, - ProblemHighlightType.GENERIC_ERROR_OR_WARNING, onTheFly)); + ProblemHighlightType.GENERIC_ERROR_OR_WARNING)); } } } }); - return problemList[0] == null + return problemList.get() == null ? null - : (ProblemDescriptor[])problemList[0].toArray(new ProblemDescriptor[problemList[0].size()]); + : problemList.get().toArray(new ProblemDescriptor[problemList.get().size()]); } private static boolean isNullLiteral(PsiExpression expr) { From cd453b2ef2f94fc500887dc1006c94e37b1da039 Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 30 Jul 2010 09:50:07 +0400 Subject: [PATCH 78/82] IDEA-56939: "Rebuild Project" often fails in X --- .../src/com/intellij/compiler/impl/CompilerCacheManager.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompilerCacheManager.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompilerCacheManager.java index 76082f3fbce2..4afce35c12ac 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompilerCacheManager.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompilerCacheManager.java @@ -171,6 +171,7 @@ public class CompilerCacheManager implements ProjectComponent { } } myCacheDisposables.clear(); + myNewCachesMap.clear(); myCompilerToCacheMap.clear(); } From bcfe870889d20c1a5c2f2d35760c3b408ee829f6 Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Thu, 29 Jul 2010 13:08:50 +0400 Subject: [PATCH 79/82] Maven: dumb-aware actions --- .../idea/maven/navigator/actions/MavenTreeAction.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/MavenTreeAction.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/MavenTreeAction.java index 18a21ec70d08..a9a4c6d06a8b 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/MavenTreeAction.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/MavenTreeAction.java @@ -21,15 +21,17 @@ import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.Shortcut; import com.intellij.openapi.keymap.Keymap; import com.intellij.openapi.keymap.KeymapManager; +import com.intellij.openapi.project.DumbAware; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.utils.MavenDataKeys; +import org.jetbrains.idea.maven.utils.actions.MavenActionUtil; import javax.swing.*; /** * @author Konstantin Bulenkov */ -public abstract class MavenTreeAction extends AnAction { +public abstract class MavenTreeAction extends AnAction implements DumbAware { private boolean updated = false; @Override @@ -49,6 +51,8 @@ public abstract class MavenTreeAction extends AnAction { } updated = true; } + e.getPresentation().setEnabled(MavenActionUtil.hasProject(e.getDataContext()) + && MavenActionUtil.getProjectsManager(e.getDataContext()).isMavenizedProject()); } @Nullable From 4e0cc12efaf69693f1aca712202d4b76654507b6 Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Thu, 29 Jul 2010 16:56:54 +0400 Subject: [PATCH 80/82] Maven: more concious action name --- plugins/maven/src/main/resources/META-INF/plugin.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/maven/src/main/resources/META-INF/plugin.xml b/plugins/maven/src/main/resources/META-INF/plugin.xml index deba1a0b35b3..b436d612e248 100644 --- a/plugins/maven/src/main/resources/META-INF/plugin.xml +++ b/plugins/maven/src/main/resources/META-INF/plugin.xml @@ -157,12 +157,12 @@ From 80b938dfec1fa7aa3deda23d78552c58217ed1ac Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Thu, 29 Jul 2010 16:57:27 +0400 Subject: [PATCH 81/82] Debugger: file colors in stack frames --- .../com/intellij/debugger/ui/impl/FramesList.java | 1 + .../debugger/ui/impl/FramesListRenderer.java | 13 +++++++++++-- .../ui/impl/watch/StackFrameDescriptorImpl.java | 10 ++++++++++ .../debugger/ui/tree/StackFrameDescriptor.java | 5 +++++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/FramesList.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/FramesList.java index 12d556c6f988..18ed4b5ba7ce 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/FramesList.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/FramesList.java @@ -16,6 +16,7 @@ package com.intellij.debugger.ui.impl; import com.intellij.debugger.ui.impl.watch.StackFrameDescriptorImpl; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.xdebugger.impl.frame.DebuggerFramesList; import com.sun.jdi.Method; diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/FramesListRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/FramesListRenderer.java index 6d60f732260b..7af0e0f32f16 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/FramesListRenderer.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/FramesListRenderer.java @@ -15,18 +15,24 @@ */ package com.intellij.debugger.ui.impl; +import com.intellij.debugger.SourcePosition; import com.intellij.debugger.ui.impl.watch.StackFrameDescriptorImpl; +import com.intellij.debugger.ui.tree.StackFrameDescriptor; import com.intellij.debugger.ui.tree.ValueMarkup; import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.ui.ColoredListCellRenderer; +import com.intellij.ui.FileColorManager; import com.intellij.ui.SimpleTextAttributes; import com.intellij.util.StringBuilderSpinAllocator; +import com.intellij.util.ui.UIUtil; import com.intellij.xdebugger.ui.DebuggerColors; import com.sun.jdi.Method; import javax.swing.*; +import java.awt.*; class FramesListRenderer extends ColoredListCellRenderer { private final EditorColorsScheme myColorScheme; @@ -52,10 +58,13 @@ class FramesListRenderer extends ColoredListCellRenderer { } if (selected) { - setBackground(com.intellij.util.ui.UIUtil.getListSelectionBackground()); + setBackground(UIUtil.getListSelectionBackground()); } else { - setBackground(shouldHighlightAsRecursive ? myColorScheme.getColor(DebuggerColors.RECURSIVE_CALL_ATTRIBUTES) : com.intellij.util.ui.UIUtil.getListBackground()); + Color bg = descriptor.getBackgroundColor(); + if (bg == null) bg = UIUtil.getListBackground(); + if (shouldHighlightAsRecursive) bg = myColorScheme.getColor(DebuggerColors.RECURSIVE_CALL_ATTRIBUTES); + setBackground(bg); } final String label = descriptor.getLabel(); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/StackFrameDescriptorImpl.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/StackFrameDescriptorImpl.java index e3a82eaeecb1..8b84358a8172 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/StackFrameDescriptorImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/StackFrameDescriptorImpl.java @@ -33,12 +33,14 @@ import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; +import com.intellij.ui.FileColorManager; import com.intellij.util.StringBuilderSpinAllocator; import com.intellij.xdebugger.ui.DebuggerIcons; import com.sun.jdi.*; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import java.awt.*; import java.util.Map; /** @@ -52,6 +54,7 @@ public class StackFrameDescriptorImpl extends NodeDescriptorImpl implements Stac private boolean myIsSynthetic; private boolean myIsInLibraryContent; private Long myObjectId; + private Color myBackgroundColor; private static final Icon myObsoleteFrameIcon = IconLoader.getIcon("/debugger/db_obsolete.png"); private Icon myIcon = DebuggerIcons.STACK_FRAME_ICON; @@ -72,6 +75,8 @@ public class StackFrameDescriptorImpl extends NodeDescriptorImpl implements Stac myIsInLibraryContent = true; } else { + myBackgroundColor = FileColorManager.getInstance(file.getProject()).getFileColor(file); + final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(getDebugProcess().getProject()).getFileIndex(); final VirtualFile vFile = file.getVirtualFile(); myIsInLibraryContent = vFile != null && (projectFileIndex.isInLibraryClasses(vFile) || projectFileIndex.isInLibrarySource(vFile)); @@ -102,6 +107,11 @@ public class StackFrameDescriptorImpl extends NodeDescriptorImpl implements Stac return myFrame.getVirtualMachine().getDebugProcess(); } + @Override + public Color getBackgroundColor() { + return myBackgroundColor; + } + @Nullable public Method getMethod() { return myMethodOccurrence.getMethod(); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/StackFrameDescriptor.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/StackFrameDescriptor.java index 388c420ce0ff..7712b1583b9c 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/StackFrameDescriptor.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/StackFrameDescriptor.java @@ -16,6 +16,11 @@ package com.intellij.debugger.ui.tree; import com.intellij.debugger.engine.StackFrameContext; +import org.jetbrains.annotations.Nullable; + +import java.awt.*; public interface StackFrameDescriptor extends NodeDescriptor, StackFrameContext { + @Nullable + Color getBackgroundColor(); } From 82922f2eb5ba938a6552f2b8ed5b8f413fcf9c49 Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Thu, 29 Jul 2010 18:23:55 +0400 Subject: [PATCH 82/82] XDebugger: file colors in stack frames --- .../com/intellij/debugger/ui/FramesPanel.java | 2 +- .../intellij/debugger/ui/impl/FramesList.java | 5 +++ .../intellij/xdebugger/frame/XStackFrame.java | 2 ++ .../impl/frame/DebuggerFramesList.java | 9 +++++- .../impl/frame/XDebuggerFramesList.java | 31 ++++++++++++++++++- .../xdebugger/impl/frame/XFramesView.java | 2 +- 6 files changed, 47 insertions(+), 4 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/FramesPanel.java b/java/debugger/impl/src/com/intellij/debugger/ui/FramesPanel.java index 1d6ac280bc4e..a2fd41de38e9 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/FramesPanel.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/FramesPanel.java @@ -80,7 +80,7 @@ public class FramesPanel extends UpdatableDebuggerView { myThreadsListener = new ThreadsListener(); myThreadsCombo.addItemListener(myThreadsListener); - myFramesList = new FramesList(); + myFramesList = new FramesList(project); myFramesListener = new FramesListener(); myFramesList.addListSelectionListener(myFramesListener); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/FramesList.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/FramesList.java index 18ed4b5ba7ce..c279b01e7e10 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/FramesList.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/FramesList.java @@ -30,6 +30,11 @@ import javax.swing.*; public class FramesList extends DebuggerFramesList { private volatile Method mySelectedMethod = null; + public FramesList(Project project) { + super(null); + doInit(); + } + protected FramesListRenderer createListRenderer() { return new FramesListRenderer(); } diff --git a/platform/xdebugger-api/src/com/intellij/xdebugger/frame/XStackFrame.java b/platform/xdebugger-api/src/com/intellij/xdebugger/frame/XStackFrame.java index 82b97af99f7c..d3167d40e7be 100644 --- a/platform/xdebugger-api/src/com/intellij/xdebugger/frame/XStackFrame.java +++ b/platform/xdebugger-api/src/com/intellij/xdebugger/frame/XStackFrame.java @@ -16,6 +16,7 @@ package com.intellij.xdebugger.frame; +import com.intellij.ui.FileColorManager; import com.intellij.ui.SimpleColoredComponent; import com.intellij.ui.SimpleTextAttributes; import com.intellij.xdebugger.XDebuggerBundle; @@ -66,6 +67,7 @@ public abstract class XStackFrame extends XValueContainer { public void customizePresentation(final SimpleColoredComponent component) { XSourcePosition position = getSourcePosition(); if (position != null) { + //FileColorManager.getInstance() component.append(position.getFile().getName(), SimpleTextAttributes.REGULAR_ATTRIBUTES); component.append(":" + (position.getLine()+1), SimpleTextAttributes.REGULAR_ATTRIBUTES); component.setIcon(DebuggerIcons.STACK_FRAME_ICON); diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/DebuggerFramesList.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/DebuggerFramesList.java index 36bbf6d2c264..012b8b63b24e 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/DebuggerFramesList.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/DebuggerFramesList.java @@ -16,6 +16,7 @@ package com.intellij.xdebugger.impl.frame; import com.intellij.ide.OccurenceNavigator; +import com.intellij.openapi.project.Project; import com.intellij.ui.components.JBList; import com.intellij.xdebugger.XDebuggerBundle; @@ -27,8 +28,14 @@ import javax.swing.event.ListSelectionListener; * @author nik */ public abstract class DebuggerFramesList extends JBList implements OccurenceNavigator { - public DebuggerFramesList() { + protected final Project myProject; + + public DebuggerFramesList(Project project) { super(new DefaultListModel()); + myProject = project; + } + + protected void doInit() { getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); setCellRenderer(createListRenderer()); getSelectionModel().addListSelectionListener(new ListSelectionListener() { diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebuggerFramesList.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebuggerFramesList.java index 6c71036bbb42..e13641291fb4 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebuggerFramesList.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebuggerFramesList.java @@ -15,12 +15,18 @@ */ package com.intellij.xdebugger.impl.frame; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; import com.intellij.ui.ColoredListCellRenderer; +import com.intellij.ui.FileColorManager; import com.intellij.ui.SimpleTextAttributes; import com.intellij.xdebugger.XDebuggerBundle; +import com.intellij.xdebugger.XSourcePosition; import com.intellij.xdebugger.frame.XStackFrame; import javax.swing.*; +import java.awt.*; /** * @author nik @@ -28,8 +34,13 @@ import javax.swing.*; public class XDebuggerFramesList extends DebuggerFramesList { private XStackFrame mySelectedFrame; + public XDebuggerFramesList(Project project) { + super(project); + doInit(); + } + protected ListCellRenderer createListRenderer() { - return new XDebuggerFrameListRenderer(); + return new XDebuggerFrameListRenderer(myProject); } protected void onFrameChanged(final Object selectedValue) { @@ -49,6 +60,14 @@ public class XDebuggerFramesList extends DebuggerFramesList { } private static class XDebuggerFrameListRenderer extends ColoredListCellRenderer { + private final FileColorManager myColorsManager; + private final PsiManager myPsiManager; + + public XDebuggerFrameListRenderer(Project project) { + myPsiManager = PsiManager.getInstance(project); + myColorsManager = FileColorManager.getInstance(project); + } + protected void customizeCellRenderer(final JList list, final Object value, final int index, @@ -64,6 +83,16 @@ public class XDebuggerFramesList extends DebuggerFramesList { } XStackFrame stackFrame = (XStackFrame)value; + if (!selected) { + XSourcePosition position = stackFrame.getSourcePosition(); + if (position != null) { + PsiFile f = myPsiManager.findFile(position.getFile()); + if (f != null) { + Color c = myColorsManager.getFileColor(f); + if (c != null) setBackground(c); + } + } + } stackFrame.customizePresentation(this); } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java index 94bba97482e7..a4583932e9b1 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java @@ -59,7 +59,7 @@ public class XFramesView extends XDebugViewBase { myThreadComboBox.addItemListener(new MyItemListener()); myMainPanel.add(myThreadComboBox, BorderLayout.NORTH); - myFramesList = new XDebuggerFramesList(); + myFramesList = new XDebuggerFramesList(session.getProject()); myFramesList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(final ListSelectionEvent e) { if (e.getValueIsAdjusting()) return;