From d2be1f3c4a3ebe43195b2837ffdab566b025ac9e Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Fri, 18 Jul 2014 19:30:24 +0200 Subject: [PATCH 01/69] disable hard consistency check --- platform/util/src/com/intellij/util/io/PersistentHashMap.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/util/src/com/intellij/util/io/PersistentHashMap.java b/platform/util/src/com/intellij/util/io/PersistentHashMap.java index de43fbd11b1b..dde187d804b5 100644 --- a/platform/util/src/com/intellij/util/io/PersistentHashMap.java +++ b/platform/util/src/com/intellij/util/io/PersistentHashMap.java @@ -80,7 +80,7 @@ public class PersistentHashMap extends PersistentEnumeratorDelegate< private final boolean myCanReEnumerate; private int myLargeIndexWatermarkId; // starting with this id we store offset in adjacent file in long format private boolean myIntAddressForNewRecord; - private static final boolean doHardConsistencyChecks = true; + private static final boolean doHardConsistencyChecks = false; private volatile boolean myBusyReading; private static class AppendStream extends DataOutputStream { From 653ccf46618d6904f78f5ae42a1d601360669d20 Mon Sep 17 00:00:00 2001 From: Evgeny Pasynkov Date: Mon, 21 Jul 2014 11:21:47 +0200 Subject: [PATCH 02/69] move to the right module --- .../com/intellij/codeInsight/InferredAnnotationsManagerImpl.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename java/{java-impl => java-analysis-impl}/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java (100%) diff --git a/java/java-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java similarity index 100% rename from java/java-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java rename to java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java From e35d9d846c5dc41107f619b116d018d7e751b25f Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 21 Jul 2014 11:32:44 +0200 Subject: [PATCH 03/69] IDEA-127077 (incorrect parsing of type annotations) --- .../lang/java/parser/DeclarationParser.java | 83 +++++----- .../impl/source/tree/java/MethodElement.java | 18 +-- .../annotationParsing/annotation/Errors.java | 6 + .../annotationParsing/annotation/Errors.txt | 91 +++++++++++ .../annotation/TypeAnnotations.java | 9 +- .../annotation/TypeAnnotations.txt | 144 +++++++++++++++++- 6 files changed, 292 insertions(+), 59 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java b/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java index 54e493126c1c..36d024726bbf 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java +++ b/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java @@ -46,6 +46,8 @@ public class DeclarationParser { JavaTokenType.IDENTIFIER, JavaTokenType.COMMA, JavaTokenType.THROWS_KEYWORD); private static final TokenSet PARAM_LIST_STOPPERS = TokenSet.create( JavaTokenType.RPARENTH, JavaTokenType.LBRACE, JavaTokenType.ARROW); + private static final TokenSet TYPE_START = TokenSet.orSet( + ElementType.PRIMITIVE_TYPE_BIT_SET, TokenSet.create(JavaTokenType.IDENTIFIER, JavaTokenType.AT)); private static final String WHITESPACES = "\n\r \t"; private static final String LINE_ENDS = "\n\r"; @@ -278,56 +280,64 @@ public class DeclarationParser { return modList; } - PsiBuilder.Marker type; - if (ElementType.PRIMITIVE_TYPE_BIT_SET.contains(builder.getTokenType())) { - type = parseTypeNotNull(builder); - } - else if (builder.getTokenType() == JavaTokenType.IDENTIFIER /*|| builder.getTokenType() == JavaTokenType.AT*/) { - 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(builder, JavaElementType.TYPE_PARAMETER_LIST); - } - builder.advanceLexer(); - if (builder.getTokenType() != JavaTokenType.LPARENTH) { - declaration.rollbackTo(); - return null; - } - return parseMethodFromLeftParenth(builder, declaration, false, true); - } - idPos.drop(); - } - else if (builder.getTokenType() == JavaTokenType.LBRACE) { + 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 = myParser.getStatementParser().parseCodeBlock(builder); + PsiBuilder.Marker codeBlock = myParser.getStatementParser().parseCodeBlock(builder); assert codeBlock != null : builder.getOriginalText(); if (typeParams != null) { - final PsiBuilder.Marker error = typeParams.precede(); + PsiBuilder.Marker error = typeParams.precede(); error.errorBefore(JavaErrorMessages.message("unexpected.token"), codeBlock); } + done(declaration, JavaElementType.CLASS_INITIALIZER); return declaration; } - else { - final PsiBuilder.Marker error; - if (typeParams != null) { - error = typeParams.precede(); + + PsiBuilder.Marker type = null; + + if (TYPE_START.contains(builder.getTokenType())) { + PsiBuilder.Marker pos = builder.mark(); + + type = myParser.getReferenceParser().parseType(builder, ReferenceParser.EAT_LAST_DOT | ReferenceParser.WILDCARD); + + if (type == null) { + pos.rollbackTo(); + } + else if (builder.getTokenType() == JavaTokenType.LPARENTH) { // constructor + if (context == Context.CODE_BLOCK) { + declaration.rollbackTo(); + return null; + } + + pos.rollbackTo(); + + if (typeParams == null) { + emptyElement(builder, JavaElementType.TYPE_PARAMETER_LIST); + } + parseAnnotations(builder); + builder.advanceLexer(); + + if (builder.getTokenType() == JavaTokenType.LPARENTH) { + return parseMethodFromLeftParenth(builder, declaration, false, true); + } + else { + declaration.rollbackTo(); + return null; + } } else { - error = builder.mark(); + pos.drop(); } + } + + if (type == null) { + PsiBuilder.Marker error = typeParams != null ? typeParams.precede() : builder.mark(); error.error(JavaErrorMessages.message("expected.identifier.or.type")); declaration.drop(); return modList; @@ -363,13 +373,6 @@ public class DeclarationParser { return parseFieldOrLocalVariable(builder, declaration, declarationStart, context); } - @NotNull - private PsiBuilder.Marker parseTypeNotNull(final PsiBuilder builder) { - final PsiBuilder.Marker type = myParser.getReferenceParser().parseType(builder, ReferenceParser.EAT_LAST_DOT | ReferenceParser.WILDCARD); - assert type != null : builder.getOriginalText(); - return type; - } - @NotNull public Pair parseModifierList(final PsiBuilder builder) { return parseModifierList(builder, ElementType.MODIFIER_BIT_SET); diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/MethodElement.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/MethodElement.java index 31fb4bca8833..1edd7cbaec76 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/MethodElement.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/MethodElement.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -41,14 +41,15 @@ public class MethodElement extends CompositeElement implements Constants { @Override public int getTextOffset() { - return findChildByRole(ChildRole.NAME).getStartOffset(); + ASTNode name = findChildByType(IDENTIFIER); + return name != null ? name.getStartOffset() : this.getStartOffset(); } @Override public TreeElement addInternal(TreeElement first, ASTNode last, ASTNode anchor, Boolean before) { - if (first == last && first.getElementType() == JavaElementType.CODE_BLOCK){ - ASTNode semicolon = findChildByRole(ChildRole.CLOSING_SEMICOLON); - if (semicolon != null){ + if (first == last && first.getElementType() == JavaElementType.CODE_BLOCK) { + ASTNode semicolon = TreeUtil.findChildBackward(this, SEMICOLON); + if (semicolon != null) { deleteChildInternal(semicolon); } } @@ -64,7 +65,7 @@ public class MethodElement extends CompositeElement implements Constants { @Override public void deleteChildInternal(@NotNull ASTNode child) { - if (child.getElementType() == CODE_BLOCK){ + if (child.getElementType() == CODE_BLOCK) { final ASTNode prevWS = TreeUtil.prevLeaf(child); if (prevWS != null && prevWS.getElementType() == TokenType.WHITE_SPACE) { removeChild(prevWS); @@ -80,9 +81,9 @@ public class MethodElement extends CompositeElement implements Constants { } @Override - public ASTNode findChildByRole(int role){ + public ASTNode findChildByRole(int role) { LOG.assertTrue(ChildRole.isUnique(role)); - switch(role){ + switch (role) { default: return null; @@ -161,5 +162,4 @@ public class MethodElement extends CompositeElement implements Constants { protected boolean isVisibilitySupported() { return true; } - } diff --git a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.java b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.java index 200c37e7fa32..4e90d08eb3ea 100644 --- a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.java +++ b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.java @@ -1,2 +1,8 @@ @Ann(0) class D { + + @EJB + Runnable myMissingEjbRef; + + public @SafeVarargs + static void m(); } \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.txt b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.txt index 9f1efdb6d2e4..678025fdf06a 100644 --- a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.txt +++ b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.txt @@ -69,5 +69,96 @@ PsiJavaFile:Errors.java PsiWhiteSpace(' ') PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n\n ') + PsiModifierList: + + PsiErrorElement:Identifier or type expected + PsiTypeParameterList + PsiJavaToken:LT('<') + PsiTypeParameter:error + PsiIdentifier:error('error') + PsiElement(EXTENDS_BOUND_LIST) + + PsiJavaToken:GT('>') + PsiModifierList:@EJB + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:EJB + PsiIdentifier:EJB('EJB') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiErrorElement:Identifier or type expected + PsiTypeParameterList + PsiJavaToken:LT('<') + PsiErrorElement:Type parameter expected + + PsiErrorElement:'>' expected. + + PsiErrorElement:Unexpected token + PsiJavaToken:DIV('/') + PsiModifierList: + + PsiTypeElement:error + PsiJavaCodeReferenceElement:error + PsiIdentifier:error('error') + PsiReferenceParameterList + + PsiErrorElement:Identifier expected + + PsiErrorElement:Unexpected token + PsiJavaToken:GT('>') + PsiWhiteSpace('\n ') + PsiField:myMissingEjbRef + PsiModifierList: + + PsiTypeElement:Runnable + PsiJavaCodeReferenceElement:Runnable + PsiIdentifier:Runnable('Runnable') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:myMissingEjbRef('myMissingEjbRef') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n\n ') + PsiModifierList:public + PsiKeyword:public('public') + PsiWhiteSpace(' ') + PsiErrorElement:Identifier or type expected + PsiTypeParameterList + PsiJavaToken:LT('<') + PsiTypeParameter:T + PsiIdentifier:T('T') + PsiElement(EXTENDS_BOUND_LIST) + + PsiJavaToken:GT('>') + PsiWhiteSpace(' ') + PsiMethod:m + PsiModifierList:@SafeVarargs + static + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:SafeVarargs + PsiIdentifier:SafeVarargs('SafeVarargs') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace('\n ') + PsiKeyword:static('static') + PsiTypeParameterList + + PsiWhiteSpace(' ') + PsiTypeElement:void + PsiKeyword:void('void') + PsiWhiteSpace(' ') + PsiIdentifier:m('m') + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiJavaToken:SEMICOLON(';') PsiWhiteSpace('\n') PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/TypeAnnotations.java b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/TypeAnnotations.java index 208e34387c56..de61404de20d 100644 --- a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/TypeAnnotations.java +++ b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/TypeAnnotations.java @@ -47,9 +47,10 @@ class SpecSamples { try (@A Reader r = new @B FileReader("/dev/zero"); @A Writer w = new @B FileWriter("/dev/null")) { } } - //interface TestClass { - // @Nullable List test(); - //} + interface TestClass { + @Nullable List test(); + @Positive int test(T t); + } // // 2. An annotation on a wildcard type argument appears before the wildcard ... @@ -76,7 +77,7 @@ class SpecSamples { // @Immutable SpecSamples() { } - // @Immutable SpecSamples(T t) { } + @Immutable SpecSamples(T t) { } // // todo [r.sh] 5. It is permitted to explicitly declare the method receiver as the first formal parameter ... diff --git a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/TypeAnnotations.txt b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/TypeAnnotations.txt index d1a8022925f3..0cc33a82fa2c 100644 --- a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/TypeAnnotations.txt +++ b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/TypeAnnotations.txt @@ -1045,11 +1045,103 @@ PsiJavaFile:TypeAnnotations.java PsiWhiteSpace('\n ') PsiJavaToken:RBRACE('}') PsiWhiteSpace('\n\n ') - PsiComment(END_OF_LINE_COMMENT)('//interface TestClass {') - PsiWhiteSpace('\n ') - PsiComment(END_OF_LINE_COMMENT)('// @Nullable List test();') - PsiWhiteSpace('\n ') - PsiComment(END_OF_LINE_COMMENT)('//}') + PsiClass:TestClass + PsiModifierList: + + PsiKeyword:interface('interface') + PsiWhiteSpace(' ') + PsiIdentifier:TestClass('TestClass') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiMethod:test + PsiModifierList: + + PsiTypeParameterList + PsiJavaToken:LT('<') + PsiTypeParameter:T + PsiIdentifier:T('T') + PsiElement(EXTENDS_BOUND_LIST) + + PsiJavaToken:GT('>') + PsiWhiteSpace(' ') + PsiTypeElement:@Nullable List + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:Nullable + PsiIdentifier:Nullable('Nullable') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:List + PsiIdentifier:List('List') + PsiReferenceParameterList + PsiJavaToken:LT('<') + PsiTypeElement:T + PsiJavaCodeReferenceElement:T + PsiIdentifier:T('T') + PsiReferenceParameterList + + PsiJavaToken:GT('>') + PsiWhiteSpace(' ') + PsiIdentifier:test('test') + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n ') + PsiMethod:test + PsiModifierList: + + PsiTypeParameterList + PsiJavaToken:LT('<') + PsiTypeParameter:T + PsiIdentifier:T('T') + PsiElement(EXTENDS_BOUND_LIST) + + PsiJavaToken:GT('>') + PsiWhiteSpace(' ') + PsiTypeElement:@Positive int + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:Positive + PsiIdentifier:Positive('Positive') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace(' ') + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:test('test') + PsiParameterList:(T t) + PsiJavaToken:LPARENTH('(') + PsiParameter:t + PsiModifierList: + + PsiTypeElement:T + PsiJavaCodeReferenceElement:T + PsiIdentifier:T('T') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:t('t') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n ') + PsiJavaToken:RBRACE('}') PsiWhiteSpace('\n\n ') PsiComment(END_OF_LINE_COMMENT)('//') PsiWhiteSpace('\n ') @@ -1492,7 +1584,47 @@ PsiJavaFile:TypeAnnotations.java PsiWhiteSpace(' ') PsiJavaToken:RBRACE('}') PsiWhiteSpace('\n ') - PsiComment(END_OF_LINE_COMMENT)('// @Immutable SpecSamples(T t) { }') + PsiMethod:SpecSamples + PsiModifierList: + + PsiTypeParameterList + PsiJavaToken:LT('<') + PsiTypeParameter:T + PsiIdentifier:T('T') + PsiElement(EXTENDS_BOUND_LIST) + + PsiJavaToken:GT('>') + PsiWhiteSpace(' ') + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:Immutable + PsiIdentifier:Immutable('Immutable') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:SpecSamples('SpecSamples') + PsiParameterList:(T t) + PsiJavaToken:LPARENTH('(') + PsiParameter:t + PsiModifierList: + + PsiTypeElement:T + PsiJavaCodeReferenceElement:T + PsiIdentifier:T('T') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:t('t') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiWhiteSpace(' ') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') PsiWhiteSpace('\n\n ') PsiComment(END_OF_LINE_COMMENT)('//') PsiWhiteSpace('\n ') From 14d57e420954b433a150b4d41acc55b0fb6ad880 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 21 Jul 2014 11:34:17 +0200 Subject: [PATCH 04/69] Cleanup (formatting) --- .../lambda/NewLambdaHighlightingTest.java | 262 ++++-------------- .../quickFix/RenameWrongReferenceTest.java | 16 +- 2 files changed, 69 insertions(+), 209 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java index 6bd7654b72af..983d28775ab5 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -31,216 +31,62 @@ public class NewLambdaHighlightingTest extends LightDaemonAnalyzerTestCase { @Override protected LocalInspectionTool[] configureLocalInspectionTools() { return new LocalInspectionTool[]{ - new UnusedSymbolLocalInspection(), + new UnusedSymbolLocalInspection() }; } - public void testIDEA93586() throws Exception { - doTest(); - } - - public void testIDEA113573() throws Exception { - doTest(); - } - - public void testIDEA112922() throws Exception { - doTest(); - } - - public void testIDEA113504() throws Exception { - doTest(); - } - - public void testAfterAbstractPipeline2() throws Exception { - doTest(); - } - - public void testIDEA116252() throws Exception { - doTest(); - } - - public void testIDEA106670() throws Exception { - doTest(); - } - - public void testIDEA116548() throws Exception { - doTest(); - } - - public void testOverloadResolutionSAM() throws Exception { - doTest(); - } - - public void testIntersectionTypesDuringInference() throws Exception { - doTest(); - } - - public void testIncludeConstraintsWhenParentMethodIsDuringCalculation() throws Exception { - doTest(); - } - - public void testUseCalculatedSubstitutor() throws Exception { - doTest(); - } - - public void testArgumentOfAnonymousClass() throws Exception { - doTest(); - } - - public void testEllipsis() throws Exception { - doTest(); - } - - public void testOuterMethodPropagation() throws Exception { - doTest(); - } - - public void testRecursiveCalls() throws Exception { - doTest(); - } - - public void testGroundTargetTypeForImplicitLambdas() throws Exception { - doTest(); - } - - public void testAdditionalConstraintsReduceOrder() throws Exception { - doTest(); - } - - public void testAdditionalConstraintSubstitution() throws Exception { - doTest(); - } - public void testFunctionalInterfacesCalculation() throws Exception { - doTest(); - } - - public void testMissedSiteSubstitutorDuringDeepAdditionalConstraintsGathering() throws Exception { - doTest(); - } - - public void testIDEA120992() throws Exception { - doTest(); - } - - public void testTargetTypeConflictResolverShouldNotTryToEvaluateCurrentArgumentType() throws Exception { - doTest(); - } - - public void testIDEA119535() throws Exception { - doTest(); - } - - public void testIDEA119003() throws Exception { - doTest(); - } - - public void testIDEA117124() throws Exception { - doTest(); - } - - public void testWildcardParameterization() throws Exception { - doTest(); - } - - public void testDiamondInLambdaReturn() throws Exception { - doTest(); - } - - public void testIDEA118965() throws Exception { - doTest(); - } - - public void testIDEA121315() throws Exception { - doTest(); - } - - public void testIDEA118965comment() throws Exception { - doTest(); - } - - public void testIDEA122074() throws Exception { - doTest(); - } - - public void testIDEA122084() throws Exception { - doTest(); - } - - public void testAdditionalConstraintDependsOnNonMentionedVars() throws Exception { - doTest(); - } - - public void testIDEA122616() throws Exception { - doTest(); - } - - public void testIDEA122700() throws Exception { - doTest(); - } - - public void testIDEA122406() throws Exception { - doTest(); - } - - public void testNestedCallsInsideLambdaReturnExpression() throws Exception { - doTest(); - } - - public void testIDEA123731() throws Exception { - doTest(); - } - - public void testIDEA123869() throws Exception { - doTest(); - } - - public void testIDEA123848() throws Exception { - doTest(); - } - - public void testOnlyLambdaAtTypeParameterPlace() throws Exception { - doTest(); - } - - public void testLiftedIntersectionType() throws Exception { - doTest(); - } - - public void testInferenceFromReturnStatements() throws Exception { - doTest(); - } - - public void testDownUpThroughLambdaReturnStatements() throws Exception { - doTest(); - } - - public void testIDEA124547() throws Exception { - doTest(); - } - - public void testIDEA118362() throws Exception { - doTest(); - } - - public void testIDEA126056() throws Exception { - doTest(); - } - - public void testIDEA125254() throws Exception { - doTest(); - } - - public void testIDEA124961() throws Exception { - doTest(); - } - - public void testIDEA126109() throws Exception { - doTest(); - } - - public void testIDEA126809() throws Exception { - doTest(); - } + public void testIDEA93586() { doTest(); } + public void testIDEA113573() { doTest(); } + public void testIDEA112922() { doTest(); } + public void testIDEA113504() { doTest(); } + public void testAfterAbstractPipeline2() { doTest(); } + public void testIDEA116252() { doTest(); } + public void testIDEA106670() { doTest(); } + public void testIDEA116548() { doTest(); } + public void testOverloadResolutionSAM() { doTest(); } + public void testIntersectionTypesDuringInference() { doTest(); } + public void testIncludeConstraintsWhenParentMethodIsDuringCalculation() { doTest(); } + public void testUseCalculatedSubstitutor() { doTest(); } + public void testArgumentOfAnonymousClass() { doTest(); } + public void testEllipsis() { doTest(); } + public void testOuterMethodPropagation() { doTest(); } + public void testRecursiveCalls() { doTest(); } + public void testGroundTargetTypeForImplicitLambdas() { doTest(); } + public void testAdditionalConstraintsReduceOrder() { doTest(); } + public void testAdditionalConstraintSubstitution() { doTest(); } + public void testFunctionalInterfacesCalculation() { doTest(); } + public void testMissedSiteSubstitutorDuringDeepAdditionalConstraintsGathering() { doTest(); } + public void testIDEA120992() { doTest(); } + public void testTargetTypeConflictResolverShouldNotTryToEvaluateCurrentArgumentType() { doTest(); } + public void testIDEA119535() { doTest(); } + public void testIDEA119003() { doTest(); } + public void testIDEA117124() { doTest(); } + public void testWildcardParameterization() { doTest(); } + public void testDiamondInLambdaReturn() { doTest(); } + public void testIDEA118965() { doTest(); } + public void testIDEA121315() { doTest(); } + public void testIDEA118965comment() { doTest(); } + public void testIDEA122074() { doTest(); } + public void testIDEA122084() { doTest(); } + public void testAdditionalConstraintDependsOnNonMentionedVars() { doTest(); } + public void testIDEA122616() { doTest(); } + public void testIDEA122700() { doTest(); } + public void testIDEA122406() { doTest(); } + public void testNestedCallsInsideLambdaReturnExpression() { doTest(); } + public void testIDEA123731() { doTest(); } + public void testIDEA123869() { doTest(); } + public void testIDEA123848() { doTest(); } + public void testOnlyLambdaAtTypeParameterPlace() { doTest(); } + public void testLiftedIntersectionType() { doTest(); } + public void testInferenceFromReturnStatements() { doTest(); } + public void testDownUpThroughLambdaReturnStatements() { doTest(); } + public void testIDEA124547() { doTest(); } + public void testIDEA118362() { doTest(); } + public void testIDEA126056() { doTest(); } + public void testIDEA125254() { doTest(); } + public void testIDEA124961() { doTest(); } + public void testIDEA126109() { doTest(); } + public void testIDEA126809() { doTest(); } private void doTest() { doTest(false); diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RenameWrongReferenceTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RenameWrongReferenceTest.java index ae2c847128b3..7b19bbd5cd27 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RenameWrongReferenceTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RenameWrongReferenceTest.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2014 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.quickFix; public class RenameWrongReferenceTest extends LightQuickFixAvailabilityTestCase { @@ -9,4 +24,3 @@ public class RenameWrongReferenceTest extends LightQuickFixAvailabilityTestCase return "/codeInsight/daemonCodeAnalyzer/quickFix/renameWrongReference"; } } - From a4cdd680585d5e29d4ffbb10fc5c42014c1d8df8 Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 21 Jul 2014 14:01:34 +0400 Subject: [PATCH 05/69] update grails project structure: remove proper instance of ContentEntry (IDEA-120622) using urls since ContentEntry uses default equals/hashcode implementation --- .../plugins/groovy/mvc/MvcModuleStructureUtil.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcModuleStructureUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcModuleStructureUtil.java index a99de0b8eb10..df0e67385c8c 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcModuleStructureUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcModuleStructureUtil.java @@ -356,11 +356,11 @@ public class MvcModuleStructureUtil { private static void removeInvalidSourceRoots(List> actions, MvcProjectStructure structure) { final Set toRemove = ContainerUtil.newTroveSet(); - final Set toRemoveContent = ContainerUtil.newTroveSet(); + final Set toRemoveContent = ContainerUtil.newTroveSet(); for (ContentEntry entry : ModuleRootManager.getInstance(structure.myModule).getContentEntries()) { final VirtualFile file = entry.getFile(); if (file == null || !structure.isValidContentRoot(file)) { - toRemoveContent.add(entry); + toRemoveContent.add(entry.getUrl()); } else { for (SourceFolder folder : entry.getSourceFolders()) { @@ -376,7 +376,7 @@ public class MvcModuleStructureUtil { @Override public void consume(ModifiableRootModel model) { for (ContentEntry entry : model.getContentEntries()) { - if (toRemoveContent.remove(entry)) { + if (toRemoveContent.remove(entry.getUrl())) { model.removeContentEntry(entry); } else { From d93d0abce8dce52f256f6beafe3f440ef425513f Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Mon, 21 Jul 2014 14:00:37 +0400 Subject: [PATCH 06/69] Workaround for another JDK bug in cached popups. --- .../src/com/intellij/ui/popup/AbstractPopup.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java b/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java index 6bfc56df4399..da79ae1f769d 100644 --- a/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java +++ b/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java @@ -764,7 +764,16 @@ public class AbstractPopup implements JBPopup { popupOwner = root.getRootPane(); } myPopup = factory.getPopup(popupOwner, myContent, targetBounds.x, targetBounds.y, this); - + myPopup.getWindow().setSize(0, 0); + Container parent = myContent.getParent(); + if (parent.getComponentCount() > 1) { + // JDK uses cached heavyweight popup without removing other components + for (Component component : parent.getComponents()) { + if (component != myContent) { + parent.remove(component); + } + } + } if (myResizable) { final JRootPane root = myContent.getRootPane(); final IdeGlassPaneImpl glass = new IdeGlassPaneImpl(root); @@ -805,11 +814,7 @@ public class AbstractPopup implements JBPopup { listener.beforeShown(new LightweightWindowEvent(this)); } - // can be improved by moving in myPopup code - myPopup.getWindow().pack(); - myPopup.setRequestFocus(myRequestFocus); - LOG.debug("popup window size: " + myPopup.getWindow().getSize()); myPopup.show(); final Window window = SwingUtilities.getWindowAncestor(myContent); From 455fc352c209dda252ad391d23895da0ed3bb6c0 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 21 Jul 2014 10:21:35 +0200 Subject: [PATCH 07/69] move destination: fix laziness --- .../AutocreatingSingleSourceRootMoveDestination.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/AutocreatingSingleSourceRootMoveDestination.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/AutocreatingSingleSourceRootMoveDestination.java index c1bc3bf60038..ce19d6bacaa5 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/AutocreatingSingleSourceRootMoveDestination.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/AutocreatingSingleSourceRootMoveDestination.java @@ -102,6 +102,6 @@ public class AutocreatingSingleSourceRootMoveDestination extends AutocreatingMov if (myTargetDirectory == null) { myTargetDirectory = RefactoringUtil.createPackageDirectoryInSourceRoot(myPackage, mySourceRoot); } - return RefactoringUtil.createPackageDirectoryInSourceRoot(myPackage, mySourceRoot); + return myTargetDirectory; } } From f03ca65d4e9e8301d0825ff8af6082476820b236 Mon Sep 17 00:00:00 2001 From: Tor Norbye Date: Mon, 21 Jul 2014 10:36:54 +0200 Subject: [PATCH 08/69] create class: filter out generated roots (IDEA-127562) --- .../com/intellij/ide/util/PackageUtil.java | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/java/java-impl/src/com/intellij/ide/util/PackageUtil.java b/java/java-impl/src/com/intellij/ide/util/PackageUtil.java index be9405ee4754..0530f34e653a 100644 --- a/java/java-impl/src/com/intellij/ide/util/PackageUtil.java +++ b/java/java-impl/src/com/intellij/ide/util/PackageUtil.java @@ -24,14 +24,12 @@ import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.projectRoots.impl.ProjectRootUtil; -import com.intellij.openapi.roots.ModulePackageIndex; -import com.intellij.openapi.roots.ModuleRootManager; -import com.intellij.openapi.roots.ProjectFileIndex; -import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.roots.*; import com.intellij.openapi.roots.ui.configuration.CommonContentEntriesEditor; import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; @@ -52,13 +50,29 @@ public class PackageUtil { @Nullable public static PsiDirectory findPossiblePackageDirectoryInModule(Module module, String packageName) { + return findPossiblePackageDirectoryInModule(module, packageName, true); + } + @Nullable + public static PsiDirectory findPossiblePackageDirectoryInModule(Module module, String packageName, boolean preferNonGeneratedRoots) { + final Project project = module.getProject(); PsiDirectory psiDirectory = null; - if (!"".equals(packageName)) { - PsiPackage rootPackage = findLongestExistingPackage(module.getProject(), packageName); + if (!StringUtil.isEmptyOrSpaces(packageName)) { + PsiPackage rootPackage = findLongestExistingPackage(project, packageName); if (rootPackage != null) { final PsiDirectory[] psiDirectories = getPackageDirectoriesInModule(rootPackage, module); if (psiDirectories.length > 0) { psiDirectory = psiDirectories[0]; + + // If we prefer to find a non-generated PsiDirectory for the given package name, search through all + // the directories for the first dir not marked as generated and use that one instead + if (preferNonGeneratedRoots && psiDirectories.length > 1) { + for (PsiDirectory dir : psiDirectories) { + if (!GeneratedSourcesFilter.isGeneratedSourceByAnyFilter(dir.getVirtualFile(), project)) { + psiDirectory = dir; + break; + } + } + } } } } @@ -66,7 +80,7 @@ public class PackageUtil { if (checkSourceRootsConfigured(module)) { final List sourceRoots = ModuleRootManager.getInstance(module).getSourceRoots(JavaModuleSourceRootTypes.SOURCES); for (VirtualFile sourceRoot : sourceRoots) { - final PsiDirectory directory = PsiManager.getInstance(module.getProject()).findDirectory(sourceRoot); + final PsiDirectory directory = PsiManager.getInstance(project).findDirectory(sourceRoot); if (directory != null) { psiDirectory = directory; break; From 9ff4e2476a2f9329e17decfe6d55b91a6758bb7f Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 21 Jul 2014 10:47:47 +0200 Subject: [PATCH 09/69] plugins update dialog layout (IDEA-127462) --- .../updateSettings/impl/PluginUpdateInfoPanel.form | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/PluginUpdateInfoPanel.form b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/PluginUpdateInfoPanel.form index 167e5ef8ab00..0e86badb08c5 100644 --- a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/PluginUpdateInfoPanel.form +++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/PluginUpdateInfoPanel.form @@ -20,7 +20,7 @@ - + @@ -41,12 +41,6 @@ - - - - - - From 6de6ee120bff173b0031f50ca0637492ceb081d9 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 21 Jul 2014 11:13:32 +0200 Subject: [PATCH 10/69] delegate methods: do not suggest to delegate when delegate would override final (IDEA-127605) --- .../generation/GenerateDelegateHandler.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateDelegateHandler.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateDelegateHandler.java index 4236da3187fc..fe4208deada7 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateDelegateHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateDelegateHandler.java @@ -251,11 +251,22 @@ public class GenerateDelegateHandler implements LanguageCodeInsightActionHandler final Set existingSignatures = new HashSet(aClass.getVisibleSignatures()); final Set selection = new HashSet(); Map superSubstitutors = new HashMap(); + + final PsiClass containingClass = targetMember.getContainingClass(); JavaPsiFacade facade = JavaPsiFacade.getInstance(target.getProject()); for (PsiMethod method : allMethods) { final PsiClass superClass = method.getContainingClass(); if (CommonClassNames.JAVA_LANG_OBJECT.equals(superClass.getQualifiedName())) continue; if (method.isConstructor()) continue; + + //do not suggest to override final method + if (method.hasModifierProperty(PsiModifier.FINAL)) { + PsiMethod overridden = containingClass.findMethodBySignature(method, true); + if (overridden != null && overridden.getContainingClass() != containingClass) { + continue; + } + } + PsiSubstitutor superSubstitutor = superSubstitutors.get(superClass); if (superSubstitutor == null) { superSubstitutor = TypeConversionUtil.getSuperClassSubstitutor(superClass, targetClass, substitutor); From 9b4912c5a07be0323c1e0899e4f1165f5f4bdd0e Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 21 Jul 2014 11:30:39 +0200 Subject: [PATCH 11/69] lambda: do not start inference from void type (IDEA-127596) --- .../source/resolve/graphInference/InferenceSession.java | 2 +- .../daemonCodeAnalyzer/lambda/newLambda/IDEA127596.java | 9 +++++++++ .../daemon/lambda/NewLambdaHighlightingTest.java | 4 ++++ 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA127596.java diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java index cd11b21475ef..57d197e1ce66 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java @@ -379,7 +379,7 @@ public class InferenceSession { PsiType returnType = method.getReturnType(); if (!PsiType.VOID.equals(returnType) && returnType != null) { PsiType targetType = getTargetType(context); - if (targetType != null) { + if (targetType != null && !PsiType.VOID.equals(targetType)) { registerReturnTypeConstraints(PsiUtil.isRawSubstitutor(method, mySiteSubstitutor) ? returnType : mySiteSubstitutor.substitute(returnType), targetType); } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA127596.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA127596.java new file mode 100644 index 000000000000..20636674141b --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA127596.java @@ -0,0 +1,9 @@ +class Executor { + void bar(Executor e) { + Runnable r = () -> foo(e); + } + + private T foo(final Executor e) { + return null; + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java index 983d28775ab5..ea9ada93ca77 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java @@ -88,6 +88,10 @@ public class NewLambdaHighlightingTest extends LightDaemonAnalyzerTestCase { public void testIDEA126109() { doTest(); } public void testIDEA126809() { doTest(); } + public void testIDEA127596() throws Exception { + doTest(); + } + private void doTest() { doTest(false); } From 62a0104757320b3bcd8a641b813d10cbc0933a94 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 21 Jul 2014 12:51:10 +0200 Subject: [PATCH 12/69] revert: Ctrl-N doesn't show after delete; no input field for Ctrl-N etc --- .../src/com/intellij/ui/popup/AbstractPopup.java | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java b/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java index da79ae1f769d..6bfc56df4399 100644 --- a/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java +++ b/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java @@ -764,16 +764,7 @@ public class AbstractPopup implements JBPopup { popupOwner = root.getRootPane(); } myPopup = factory.getPopup(popupOwner, myContent, targetBounds.x, targetBounds.y, this); - myPopup.getWindow().setSize(0, 0); - Container parent = myContent.getParent(); - if (parent.getComponentCount() > 1) { - // JDK uses cached heavyweight popup without removing other components - for (Component component : parent.getComponents()) { - if (component != myContent) { - parent.remove(component); - } - } - } + if (myResizable) { final JRootPane root = myContent.getRootPane(); final IdeGlassPaneImpl glass = new IdeGlassPaneImpl(root); @@ -814,7 +805,11 @@ public class AbstractPopup implements JBPopup { listener.beforeShown(new LightweightWindowEvent(this)); } + // can be improved by moving in myPopup code + myPopup.getWindow().pack(); + myPopup.setRequestFocus(myRequestFocus); + LOG.debug("popup window size: " + myPopup.getWindow().getSize()); myPopup.show(); final Window window = SwingUtilities.getWindowAncestor(myContent); From bcd970c4a6e430be80f1e70394a62be06f625cde Mon Sep 17 00:00:00 2001 From: Vassiliy Date: Mon, 21 Jul 2014 15:17:29 +0400 Subject: [PATCH 13/69] Nullable / NotNull --- .../openapi/ui/ThreeComponentsSplitter.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/ui/ThreeComponentsSplitter.java b/platform/platform-api/src/com/intellij/openapi/ui/ThreeComponentsSplitter.java index faa26e2415b8..62864d01b91a 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/ThreeComponentsSplitter.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/ThreeComponentsSplitter.java @@ -26,6 +26,7 @@ import com.intellij.ui.UIBundle; import com.intellij.util.ui.update.Activatable; import com.intellij.util.ui.update.UiNotifyConnector; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; @@ -56,9 +57,9 @@ public class ThreeComponentsSplitter extends JPanel implements Disposable { private final Divider myFirstDivider; private final Divider myLastDivider; - private JComponent myFirstComponent; - private JComponent myInnerComponent; - private JComponent myLastComponent; + @Nullable private JComponent myFirstComponent; + @Nullable private JComponent myInnerComponent; + @Nullable private JComponent myLastComponent; private int myFirstSize = 10; private int myLastSize = 10; @@ -303,6 +304,7 @@ public class ThreeComponentsSplitter extends JPanel implements Disposable { repaint(); } + @Nullable public JComponent getFirstComponent() { return myFirstComponent; } @@ -312,7 +314,7 @@ public class ThreeComponentsSplitter extends JPanel implements Disposable { * repaint the splitter. If there is already * */ - public void setFirstComponent(JComponent component) { + public void setFirstComponent(@Nullable JComponent component) { if (myFirstComponent != component) { if (myFirstComponent != null) { remove(myFirstComponent); @@ -325,6 +327,7 @@ public class ThreeComponentsSplitter extends JPanel implements Disposable { } } + @Nullable public JComponent getLastComponent() { return myLastComponent; } @@ -335,7 +338,7 @@ public class ThreeComponentsSplitter extends JPanel implements Disposable { * repaint the splitter. * */ - public void setLastComponent(JComponent component) { + public void setLastComponent(@Nullable JComponent component) { if (myLastComponent != component) { if (myLastComponent != null) { remove(myLastComponent); @@ -348,7 +351,7 @@ public class ThreeComponentsSplitter extends JPanel implements Disposable { } } - + @Nullable public JComponent getInnerComponent() { return myInnerComponent; } @@ -359,7 +362,7 @@ public class ThreeComponentsSplitter extends JPanel implements Disposable { * repaint the splitter. * */ - public void setInnerComponent(JComponent component) { + public void setInnerComponent(@Nullable JComponent component) { if (myInnerComponent != component) { if (myInnerComponent != null) { remove(myInnerComponent); From 8e740380dce76cc2c9915068aa49e499259c70dc Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Mon, 21 Jul 2014 13:24:14 +0200 Subject: [PATCH 14/69] additional tracing code for difference of this session and previous session of particular content calculation --- .../util/indexing/MapReduceIndex.java | 43 +++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/util/indexing/MapReduceIndex.java b/platform/lang-impl/src/com/intellij/util/indexing/MapReduceIndex.java index 22eb85914754..ebb7911e82be 100644 --- a/platform/lang-impl/src/com/intellij/util/indexing/MapReduceIndex.java +++ b/platform/lang-impl/src/com/intellij/util/indexing/MapReduceIndex.java @@ -360,14 +360,16 @@ public class MapReduceIndex implements UpdatableIndex contentData = myIndexer.map(content); + boolean sameValueForSavedIndexedResultAndCurrentOne = contentData.equals(data); if (!sameValueForSavedIndexedResultAndCurrentOne) { DebugAssertions.error( - "Unexpected difference in indexing of %s by index %s, file type %s, charset %s\nprevious indexed info %s", + "Unexpected difference in indexing of %s by index %s, file type %s, charset %s\ndiff %s\nprevious indexed info %s", fileContent.getFile(), myIndexId, fileContent.getFileType(), ((FileContentImpl)fileContent).getCharset(), + buildDiff(data, contentData), myIndexingTrace.get(hashId) ); } @@ -395,7 +397,7 @@ public class MapReduceIndex implements UpdatableIndex implements UpdatableIndex data, Map contentData) { + StringBuilder moreInfo = new StringBuilder(); + if (contentData.size() != data.size()) { + moreInfo.append("Indexer has different number of elements, previously ").append(data.size()).append(" after ") + .append(contentData.size()).append("\n"); + } else { + moreInfo.append("total ").append(contentData.size()).append(" entries\n"); + } + + for(Map.Entry keyValueEntry:contentData.entrySet()) { + if (!data.containsKey(keyValueEntry.getKey())) { + moreInfo.append("Previous data doesn't contain:").append(keyValueEntry.getKey()).append( " with value ").append(keyValueEntry.getValue()).append("\n"); + } + else { + Value value = data.get(keyValueEntry.getKey()); + if (!Comparing.equal(keyValueEntry.getValue(), value)) { + moreInfo.append("Previous data has different value for key:").append(keyValueEntry.getKey()).append( ", new value ").append(keyValueEntry.getValue()).append( ", oldValue:").append(value).append("\n"); + } + } + } + + for(Map.Entry keyValueEntry:data.entrySet()) { + if (!contentData.containsKey(keyValueEntry.getKey())) { + moreInfo.append("New data doesn't contain:").append(keyValueEntry.getKey()).append( " with value ").append(keyValueEntry.getValue()).append("\n"); + } + else { + Value value = contentData.get(keyValueEntry.getKey()); + if (!Comparing.equal(keyValueEntry.getValue(), value)) { + moreInfo.append("New data has different value for key:").append(keyValueEntry.getKey()).append( " new value ").append(value).append( ", oldValue:").append(keyValueEntry.getValue()).append("\n"); + } + } + } + return moreInfo; + } + private Map deserializeSavedPersistentData(ByteSequence bytes) throws IOException { DataInputStream stream = new DataInputStream(new UnsyncByteArrayInputStream(bytes.getBytes(), bytes.getOffset(), bytes.getLength())); int pairs = DataInputOutputUtil.readINT(stream); From 9ca2a550503f36c03bdd49a577ddcef3250909a7 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Mon, 21 Jul 2014 13:26:16 +0200 Subject: [PATCH 15/69] reverted e442926 because there is no thread visibility problem right now (per discussion with Roman.Shevchenko) --- .../progress/ProgressIndicatorProvider.java | 17 ++++++----------- .../openapi/progress/ProgressManager.java | 9 ++++----- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/platform/core-api/src/com/intellij/openapi/progress/ProgressIndicatorProvider.java b/platform/core-api/src/com/intellij/openapi/progress/ProgressIndicatorProvider.java index c6b69bc6dc27..0f50f8d05ecf 100644 --- a/platform/core-api/src/com/intellij/openapi/progress/ProgressIndicatorProvider.java +++ b/platform/core-api/src/com/intellij/openapi/progress/ProgressIndicatorProvider.java @@ -23,7 +23,7 @@ import org.jetbrains.annotations.Nullable; */ public abstract class ProgressIndicatorProvider { @Nullable - public static volatile ProgressIndicatorProvider ourInstance; + public static ProgressIndicatorProvider ourInstance; @Nullable public static ProgressIndicatorProvider getInstance() { @@ -36,27 +36,22 @@ public abstract class ProgressIndicatorProvider { @Nullable public static ProgressIndicator getGlobalProgressIndicator() { - ProgressIndicatorProvider provider = ourInstance; - return provider != null ? provider.getProgressIndicator() : null; + return ourInstance != null ? ourInstance.getProgressIndicator() : null; } public abstract NonCancelableSection startNonCancelableSection(); @NotNull public static NonCancelableSection startNonCancelableSectionIfSupported() { - ProgressIndicatorProvider provider = ourInstance; - return provider != null ? provider.startNonCancelableSection() : NonCancelableSection.EMPTY; + return ourInstance != null ? ourInstance.startNonCancelableSection() : NonCancelableSection.EMPTY; } public static volatile boolean ourNeedToCheckCancel = false; public static void checkCanceled() throws ProcessCanceledException { // smart optimization! There's a thread started in ProgressManagerImpl, that set's this flag up once in 10 milliseconds - if (ourNeedToCheckCancel) { - ProgressIndicatorProvider provider = ourInstance; - if (provider != null) { - provider.doCheckCanceled(); - ourNeedToCheckCancel = false; - } + if (ourNeedToCheckCancel && ourInstance != null) { + ourInstance.doCheckCanceled(); + ourNeedToCheckCancel = false; } } } diff --git a/platform/core-api/src/com/intellij/openapi/progress/ProgressManager.java b/platform/core-api/src/com/intellij/openapi/progress/ProgressManager.java index d65e4367f130..a319700b4be2 100644 --- a/platform/core-api/src/com/intellij/openapi/progress/ProgressManager.java +++ b/platform/core-api/src/com/intellij/openapi/progress/ProgressManager.java @@ -50,14 +50,13 @@ public abstract class ProgressManager { }; } - private static volatile ProgressManager ourInstance; + private static ProgressManager ourInstance; public static ProgressManager getInstance() { - ProgressManager progressManager = ourInstance; - if (progressManager == null) { - ourInstance = progressManager = ServiceManager.getService(ProgressManager.class); + if (ourInstance == null) { + ourInstance = ServiceManager.getService(ProgressManager.class); } - return progressManager; + return ourInstance; } public abstract boolean hasProgressIndicator(); From 0cf69f8a23fc764a6d89f77d443844f273cf4201 Mon Sep 17 00:00:00 2001 From: Ilya Klyuchnikov Date: Mon, 21 Jul 2014 15:47:39 +0400 Subject: [PATCH 16/69] bytecode analysis: resolve only wrt PsiClassOwner (IDEA-127608) --- .../bytecodeAnalysis/BytecodeAnalysisConverter.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisConverter.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisConverter.java index 38eaf83dbe2a..f29dd7f6cf0c 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisConverter.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisConverter.java @@ -263,11 +263,12 @@ public class BytecodeAnalysisConverter implements ApplicationComponent { private int mkPsiClassKey(PsiClass psiClass, int dimensions) throws IOException { - PsiClassOwner psiFile = (PsiClassOwner) psiClass.getContainingFile(); - if (psiFile == null) { - LOG.debug("getContainingFile was null for " + psiClass.getQualifiedName()); + PsiFile containingFile = psiClass.getContainingFile(); + if (!(containingFile instanceof PsiClassOwner)) { + LOG.debug("containingFile was not resolved for " + psiClass.getQualifiedName()); return -1; } + PsiClassOwner psiFile = (PsiClassOwner)containingFile; String packageName = psiFile.getPackageName(); String qname = psiClass.getQualifiedName(); if (qname == null) { From fd0bb1e4df3ed4bdba5623cc64ec8c446e1be331 Mon Sep 17 00:00:00 2001 From: Michael Golubev Date: Mon, 21 Jul 2014 13:55:20 +0200 Subject: [PATCH 17/69] IDEA-127620 - Clouds: move frameworks to the top level in new module/project wizard --- .../impl/remote-servers-java-impl.iml | 2 + .../impl/src/META-INF/RemoteServersJava.xml | 7 + .../module/CloudAccountSelectionPanel.form | 43 ++++ .../module/CloudAccountSelectionPanel.java | 189 ++++++++++++++++++ .../module/CloudApplicationConfigurable.java | 166 +++++++++++++++ .../module/CloudApplicationConfiguration.java | 36 ++++ .../impl/module/CloudModuleBuilder.java | 114 +++++++++++ .../CloudModuleBuilderContribution.java | 48 +++++ .../CloudModuleBuilderContributionBase.java | 142 +++++++++++++ .../impl/module/CloudModuleWizardStep.form | 50 +++++ .../impl/module/CloudModuleWizardStep.java | 143 +++++++++++++ .../impl/resources/resources/cloud.properties | 2 + .../RemoteServerConfigurable.java | 22 +- 13 files changed, 954 insertions(+), 10 deletions(-) create mode 100644 java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudAccountSelectionPanel.form create mode 100644 java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudAccountSelectionPanel.java create mode 100644 java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfigurable.java create mode 100644 java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfiguration.java create mode 100644 java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilder.java create mode 100644 java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContribution.java create mode 100644 java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContributionBase.java create mode 100644 java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleWizardStep.form create mode 100644 java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleWizardStep.java diff --git a/java/remote-servers/impl/remote-servers-java-impl.iml b/java/remote-servers/impl/remote-servers-java-impl.iml index b0228d7f4075..6999e2deac71 100644 --- a/java/remote-servers/impl/remote-servers-java-impl.iml +++ b/java/remote-servers/impl/remote-servers-java-impl.iml @@ -13,6 +13,8 @@ + + diff --git a/java/remote-servers/impl/src/META-INF/RemoteServersJava.xml b/java/remote-servers/impl/src/META-INF/RemoteServersJava.xml index cec87d9643f2..24a0776ccd29 100644 --- a/java/remote-servers/impl/src/META-INF/RemoteServersJava.xml +++ b/java/remote-servers/impl/src/META-INF/RemoteServersJava.xml @@ -1,7 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudAccountSelectionPanel.form b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudAccountSelectionPanel.form new file mode 100644 index 000000000000..87eff737a482 --- /dev/null +++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudAccountSelectionPanel.form @@ -0,0 +1,43 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudAccountSelectionPanel.java b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudAccountSelectionPanel.java new file mode 100644 index 000000000000..aecaebd960b9 --- /dev/null +++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudAccountSelectionPanel.java @@ -0,0 +1,189 @@ +/* + * Copyright 2000-2014 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.remoteServer.impl.module; + +import com.intellij.ide.DataManager; +import com.intellij.ide.actions.ShowSettingsUtilImpl; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.DefaultActionGroup; +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.options.ex.SingleConfigurableEditor; +import com.intellij.openapi.ui.ComboBox; +import com.intellij.openapi.ui.popup.JBPopupFactory; +import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Ref; +import com.intellij.remoteServer.ServerType; +import com.intellij.remoteServer.configuration.RemoteServer; +import com.intellij.remoteServer.configuration.RemoteServersManager; +import com.intellij.remoteServer.impl.configuration.RemoteServerConfigurable; +import com.intellij.util.Consumer; +import com.intellij.util.text.UniqueNameGenerator; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.List; + + +public class CloudAccountSelectionPanel { + + private JButton myNewButton; + private ComboBox myAccountComboBox; + private JPanel myMainPanel; + + private final List> myCloudTypes; + + private Runnable myServerSelectionListener; + + public CloudAccountSelectionPanel(List> cloudTypes) { + myCloudTypes = cloudTypes; + + for (ServerType cloudType : cloudTypes) { + for (RemoteServer account : RemoteServersManager.getInstance().getServers(cloudType)) { + myAccountComboBox.addItem(new AccountItem(account)); + } + } + + myNewButton.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + onNewButton(); + } + }); + + myAccountComboBox.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + if (myServerSelectionListener != null) { + myServerSelectionListener.run(); + } + } + }); + } + + public void setAccountSelectionListener(Runnable listener) { + myServerSelectionListener = listener; + } + + private void onNewButton() { + DefaultActionGroup group = new DefaultActionGroup(); + for (final ServerType cloudType : myCloudTypes) { + group.add(new AnAction(cloudType.getPresentableName(), cloudType.getPresentableName(), cloudType.getIcon()) { + + @Override + public void actionPerformed(AnActionEvent e) { + createAccount(cloudType); + } + }); + } + JBPopupFactory.getInstance().createActionGroupPopup("New Account", group, DataManager.getInstance().getDataContext(myMainPanel), + JBPopupFactory.ActionSelectionAid.SPEEDSEARCH, false) + .showUnderneathOf(myNewButton); + } + + private void createAccount(ServerType cloudType) { + RemoteServer newAccount = RemoteServersManager.getInstance().createServer(cloudType, generateServerName(cloudType)); + + final Ref> errorConsumerRef = new Ref>(); + + RemoteServerConfigurable configurable = new RemoteServerConfigurable(newAccount, null, true) { + + @Override + protected void setConnectionStatusText(boolean error, String text) { + super.setConnectionStatusText(error, error ? "" : text); + errorConsumerRef.get().consume(error ? text : null); + } + }; + + final SingleConfigurableEditor configurableEditor + = new SingleConfigurableEditor(myMainPanel, configurable, ShowSettingsUtilImpl.createDimensionKey(configurable), false) { + + { + errorConsumerRef.set(new Consumer() { + + @Override + public void consume(String s) { + setErrorText(s); + } + }); + } + }; + + if (!configurableEditor.showAndGet()) { + return; + } + + newAccount.setName(configurable.getDisplayName()); + + RemoteServersManager.getInstance().addServer(newAccount); + AccountItem newAccountItem = new AccountItem(newAccount); + myAccountComboBox.addItem(newAccountItem); + myAccountComboBox.setSelectedItem(newAccountItem); + } + + public JComponent getMainPanel() { + return myMainPanel; + } + + @Nullable + public RemoteServer getSelectedAccount() { + AccountItem selectedItem = (AccountItem)myAccountComboBox.getSelectedItem(); + return selectedItem == null ? null : selectedItem.getAccount(); + } + + private static String generateServerName(ServerType cloudType) { + return UniqueNameGenerator.generateUniqueName(cloudType.getPresentableName(), new Condition() { + + @Override + public boolean value(String s) { + for (RemoteServer server : RemoteServersManager.getInstance().getServers()) { + if (server.getName().equals(s)) { + return false; + } + } + return true; + } + }); + } + + public void validate() throws ConfigurationException { + if (getSelectedAccount() == null) { + throw new ConfigurationException("Account required"); + } + } + + private static class AccountItem { + + private final RemoteServer myAccount; + + public AccountItem(RemoteServer account) { + myAccount = account; + } + + public RemoteServer getAccount() { + return myAccount; + } + + @Override + public String toString() { + return myAccount.getName(); + } + } +} diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfigurable.java b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfigurable.java new file mode 100644 index 000000000000..14bd043a7f23 --- /dev/null +++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfigurable.java @@ -0,0 +1,166 @@ +/* + * Copyright 2000-2014 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.remoteServer.impl.module; + +import com.intellij.openapi.Disposable; +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Disposer; +import com.intellij.remoteServer.configuration.RemoteServer; +import com.intellij.remoteServer.runtime.Deployment; +import com.intellij.remoteServer.runtime.ServerConnection; +import com.intellij.remoteServer.runtime.ServerConnector; +import com.intellij.remoteServer.runtime.deployment.ServerRuntimeInstance; +import com.intellij.remoteServer.util.*; +import com.intellij.util.concurrency.Semaphore; +import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.util.Collection; +import java.util.concurrent.atomic.AtomicReference; + + +public abstract class CloudApplicationConfigurable< + SC extends CloudConfigurationBase, + DC extends CloudDeploymentNameConfiguration, + SR extends CloudMultiSourceServerRuntimeInstance, + AC extends CloudApplicationConfiguration> { + + private final Project myProject; + private final Disposable myParentDisposable; + + private DelayedRunner myRunner; + + private RemoteServer myAccount; + + public CloudApplicationConfigurable(@Nullable Project project, Disposable parentDisposable) { + myProject = project; + myParentDisposable = parentDisposable; + } + + public void setAccount(RemoteServer account) { + myAccount = account; + clearCloudData(); + } + + protected RemoteServer getAccount() { + return (RemoteServer)myAccount; + } + + public JComponent getComponent() { + JComponent result = getMainPanel(); + if (myRunner == null) { + myRunner = new DelayedRunner(result) { + + private RemoteServer myPreviousAccount; + + @Override + protected boolean wasChanged() { + boolean result = myPreviousAccount != myAccount; + if (result) { + myPreviousAccount = myAccount; + } + return result; + } + + @Override + protected void run() { + loadCloudData(); + } + }; + Disposer.register(myParentDisposable, myRunner); + } + return result; + } + + protected void clearCloudData() { + getExistingComboBox().removeAllItems(); + } + + protected void loadCloudData() { + new ConnectionTask>("Loading existing applications list") { + + @Override + protected void run(final ServerConnection connection, + final Semaphore semaphore, + final AtomicReference> result) { + connection.connectIfNeeded(new ServerConnector.ConnectionCallback() { + + @Override + public void connected(@NotNull ServerRuntimeInstance serverRuntimeInstance) { + connection.computeDeployments(new Runnable() { + + @Override + public void run() { + result.set(connection.getDeployments()); + semaphore.up(); + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + if (!Disposer.isDisposed(myParentDisposable)) { + setupExistingApplications(result.get()); + } + } + }); + } + }); + } + + @Override + public void errorOccurred(@NotNull String errorMessage) { + runtimeErrorOccurred(errorMessage); + semaphore.up(); + } + }); + } + + @Override + protected Collection run(SR serverRuntimeInstance) throws ServerRuntimeException { + return null; + } + }.performAsync(); + } + + private void setupExistingApplications(Collection deployments) { + JComboBox existingComboBox = getExistingComboBox(); + existingComboBox.removeAllItems(); + for (Deployment deployment : deployments) { + existingComboBox.addItem(deployment.getName()); + } + } + + protected Project getProject() { + return myProject; + } + + protected abstract JComboBox getExistingComboBox(); + + protected abstract JComponent getMainPanel(); + + public abstract AC createConfiguration(); + + public abstract void validate() throws ConfigurationException; + + protected abstract class ConnectionTask extends CloudConnectionTask { + + public ConnectionTask(String title) { + super(myProject, title, CloudApplicationConfigurable.this.getAccount()); + } + } +} + diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfiguration.java b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfiguration.java new file mode 100644 index 000000000000..9af0f1ad472b --- /dev/null +++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfiguration.java @@ -0,0 +1,36 @@ +/* + * Copyright 2000-2014 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.remoteServer.impl.module; + + +public abstract class CloudApplicationConfiguration { + + private boolean myExisting; + private final String myExistingAppName; + + protected CloudApplicationConfiguration(boolean existing, String existingAppName) { + myExisting = existing; + myExistingAppName = existingAppName; + } + + public boolean isExisting() { + return myExisting; + } + + public String getExistingAppName() { + return myExistingAppName; + } +} diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilder.java b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilder.java new file mode 100644 index 000000000000..4aa8d60bcea4 --- /dev/null +++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilder.java @@ -0,0 +1,114 @@ +/* + * Copyright 2000-2014 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.remoteServer.impl.module; + +import com.intellij.icons.AllIcons; +import com.intellij.ide.util.projectWizard.JavaModuleBuilder; +import com.intellij.ide.util.projectWizard.ModuleBuilderListener; +import com.intellij.ide.util.projectWizard.ModuleWizardStep; +import com.intellij.ide.util.projectWizard.WizardContext; +import com.intellij.openapi.Disposable; +import com.intellij.openapi.module.JavaModuleType; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.roots.ui.configuration.ModulesProvider; +import com.intellij.remoteServer.configuration.RemoteServer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + + +public class CloudModuleBuilder extends JavaModuleBuilder { + + private RemoteServer myAccount; + private CloudApplicationConfiguration myApplicationConfiguration; + + public CloudModuleBuilder() { + addListener(new ModuleBuilderListener() { + + @Override + public void moduleCreated(@NotNull Module module) { + configureModule(module); + } + }); + } + + public String getBuilderId() { + return getClass().getName(); + } + + @Override + public Icon getBigIcon() { + return AllIcons.General.Balloon; + } + + @Override + public Icon getNodeIcon() { + return AllIcons.General.Balloon; + } + + @Override + public String getDescription() { + return "Java module of PAAS cloud application"; + } + + @Override + public String getPresentableName() { + return "Clouds"; + } + + @Override + public String getGroupName() { + return "Clouds"; + } + + @Override + public String getParentGroup() { + return JavaModuleType.JAVA_GROUP; + } + + @Override + public int getWeight() { + return 30; + } + + @Override + public ModuleWizardStep[] createWizardSteps(@NotNull WizardContext wizardContext, @NotNull ModulesProvider modulesProvider) { + return ModuleWizardStep.EMPTY_ARRAY; + } + + @Nullable + @Override + public ModuleWizardStep getCustomOptionsStep(WizardContext context, Disposable parentDisposable) { + return new CloudModuleWizardStep(this, context.getProject(), parentDisposable); + } + + public void setAccount(RemoteServer account) { + myAccount = account; + } + + public RemoteServer getAccount() { + return myAccount; + } + + public void setApplicationConfiguration(CloudApplicationConfiguration applicationConfiguration) { + myApplicationConfiguration = applicationConfiguration; + } + + private void configureModule(final Module module) { + CloudModuleBuilderContribution.getInstanceByType(myAccount.getType()).configureModule(module, myAccount, myApplicationConfiguration); + } +} diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContribution.java b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContribution.java new file mode 100644 index 000000000000..6643c89cc1c4 --- /dev/null +++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContribution.java @@ -0,0 +1,48 @@ +/* + * Copyright 2000-2014 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.remoteServer.impl.module; + +import com.intellij.openapi.Disposable; +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.intellij.remoteServer.ServerType; +import com.intellij.remoteServer.configuration.RemoteServer; +import org.jetbrains.annotations.Nullable; + + +public abstract class CloudModuleBuilderContribution { + + public static final ExtensionPointName EP_NAME + = ExtensionPointName.create("com.intellij.remoteServer.moduleBuilderContribution"); + + public abstract ServerType getCloudType(); + + public abstract CloudApplicationConfigurable createApplicationConfigurable(@Nullable Project project, Disposable parentDisposable); + + public abstract void configureModule(Module module, + RemoteServer account, + CloudApplicationConfiguration configuration); + + public static CloudModuleBuilderContribution getInstanceByType(ServerType cloudType) { + for (CloudModuleBuilderContribution contribution : EP_NAME.getExtensions()) { + if (contribution.getCloudType() == cloudType) { + return contribution; + } + } + return null; + } +} diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContributionBase.java b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContributionBase.java new file mode 100644 index 000000000000..6a927d97bb93 --- /dev/null +++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContributionBase.java @@ -0,0 +1,142 @@ +/* + * Copyright 2000-2014 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.remoteServer.impl.module; + +import com.intellij.execution.RunManagerEx; +import com.intellij.execution.RunnerAndConfigurationSettings; +import com.intellij.execution.configurations.ConfigurationType; +import com.intellij.openapi.Disposable; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModulePointer; +import com.intellij.openapi.module.ModulePointerManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.MessageType; +import com.intellij.remoteServer.ServerType; +import com.intellij.remoteServer.configuration.RemoteServer; +import com.intellij.remoteServer.impl.configuration.deployment.DeployToServerConfigurationType; +import com.intellij.remoteServer.impl.configuration.deployment.DeployToServerRunConfiguration; +import com.intellij.remoteServer.impl.configuration.deployment.ModuleDeploymentSourceImpl; +import com.intellij.remoteServer.util.*; +import com.intellij.remoteServer.util.ssh.SshKeyChecker; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + + +public abstract class CloudModuleBuilderContributionBase< + SC extends CloudConfigurationBase, + DC extends CloudDeploymentNameConfiguration, + AC extends CloudApplicationConfiguration, + SR extends CloudMultiSourceServerRuntimeInstance> + extends CloudModuleBuilderContribution { + + @Override + public void configureModule(Module module, + RemoteServer account, + CloudApplicationConfiguration applicationConfiguration) { + RemoteServer castedAccount = (RemoteServer)account; + final AC castedApplicationConfiguration = (AC)applicationConfiguration; + + DC deploymentConfiguration = createDeploymentConfiguration(); + + if (applicationConfiguration.isExisting()) { + deploymentConfiguration.setDefaultDeploymentName(false); + deploymentConfiguration.setDeploymentName(applicationConfiguration.getExistingAppName()); + } + + final DeployToServerRunConfiguration runConfiguration = createRunConfiguration(module, castedAccount, deploymentConfiguration); + + final String cloudName = account.getType().getPresentableName(); + final Project project = module.getProject(); + new CloudConnectionTask(project, CloudBundle.getText("cloud.support", cloudName), castedAccount) { + + CloudNotifier myNotifier = new CloudNotifier(cloudName); + + boolean myFirstAttempt = true; + + @Override + protected Object run(SR serverRuntime) throws ServerRuntimeException { + doConfigureModule(castedApplicationConfiguration, runConfiguration, myFirstAttempt, serverRuntime); + myNotifier.showMessage(CloudBundle.getText("cloud.support.added", cloudName), MessageType.INFO); + return null; + } + + @Override + protected void runtimeErrorOccurred(@NotNull String errorMessage) { + myFirstAttempt = false; + new SshKeyChecker().checkServerError(errorMessage, myNotifier, project, this); + } + }.performAsync(); + } + + private DeployToServerRunConfiguration createRunConfiguration(Module module, + RemoteServer server, + DC deploymentConfiguration) { + Project project = module.getProject(); + + String serverName = server.getName(); + + String name = generateRunConfigurationName(serverName, module.getName()); + + final RunManagerEx runManager = RunManagerEx.getInstanceEx(project); + final RunnerAndConfigurationSettings runSettings + = runManager.createRunConfiguration(name, getRunConfigurationType().getConfigurationFactories()[0]); + + final DeployToServerRunConfiguration result = (DeployToServerRunConfiguration)runSettings.getConfiguration(); + + result.setServerName(serverName); + + final ModulePointer modulePointer = ModulePointerManager.getInstance(project).create(module); + result.setDeploymentSource(new ModuleDeploymentSourceImpl(modulePointer)); + + result.setDeploymentConfiguration(deploymentConfiguration); + + runManager.addConfiguration(runSettings, false); + runManager.setSelectedConfiguration(runSettings); + + return result; + } + + private static String generateRunConfigurationName(String serverName, String moduleName) { + return CloudBundle.getText("run.configuration.name", serverName, moduleName); + } + + private DeployToServerConfigurationType getRunConfigurationType() { + String id = DeployToServerConfigurationType.getId(getCloudType()); + for (ConfigurationType configurationType : ConfigurationType.CONFIGURATION_TYPE_EP.getExtensions()) { + if (configurationType instanceof DeployToServerConfigurationType) { + DeployToServerConfigurationType deployConfigurationType = (DeployToServerConfigurationType)configurationType; + if (deployConfigurationType.getId().equals(id)) { + return deployConfigurationType; + } + } + } + return null; + } + + @Override + public abstract ServerType getCloudType(); + + @Override + public abstract CloudApplicationConfigurable createApplicationConfigurable(@Nullable Project project, + Disposable parentDisposable); + + protected abstract DC createDeploymentConfiguration(); + + protected abstract void doConfigureModule(AC applicationConfiguration, + DeployToServerRunConfiguration runConfiguration, + boolean firstAttempt, + SR serverRuntime) throws ServerRuntimeException; +} diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleWizardStep.form b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleWizardStep.form new file mode 100644 index 000000000000..19cbaa7f2a5f --- /dev/null +++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleWizardStep.form @@ -0,0 +1,50 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleWizardStep.java b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleWizardStep.java new file mode 100644 index 000000000000..4ca4aa4685df --- /dev/null +++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleWizardStep.java @@ -0,0 +1,143 @@ +/* + * Copyright 2000-2014 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.remoteServer.impl.module;/* + * Copyright 2000-2014 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. + */ + +import com.intellij.ide.util.projectWizard.ModuleWizardStep; +import com.intellij.openapi.Disposable; +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.project.Project; +import com.intellij.remoteServer.ServerType; +import com.intellij.remoteServer.configuration.RemoteServer; +import com.intellij.util.containers.hash.HashMap; + +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + + +public class CloudModuleWizardStep extends ModuleWizardStep { + + private JPanel myMainPanel; + private JPanel myAccountPanelPlaceHolder; + private JPanel myApplicationPanelPlaceHolder; + + private final CloudModuleBuilder myModuleBuilder; + private final Project myProject; + private final Disposable myParentDisposable; + + private CloudAccountSelectionPanel myAccountSelectionPanel; + + private Map, CloudApplicationConfigurable> myCloudType2ApplicationConfigurable; + + public CloudModuleWizardStep(CloudModuleBuilder moduleBuilder, Project project, Disposable parentDisposable) { + myModuleBuilder = moduleBuilder; + myProject = project; + myParentDisposable = parentDisposable; + + myCloudType2ApplicationConfigurable = new HashMap, CloudApplicationConfigurable>(); + + List> cloudTypes = new ArrayList>(); + for (CloudModuleBuilderContribution contribution : CloudModuleBuilderContribution.EP_NAME.getExtensions()) { + cloudTypes.add(contribution.getCloudType()); + } + + myAccountSelectionPanel = new CloudAccountSelectionPanel(cloudTypes); + myAccountPanelPlaceHolder.add(myAccountSelectionPanel.getMainPanel()); + + myAccountSelectionPanel.setAccountSelectionListener(new Runnable() { + + @Override + public void run() { + onAccountSelectionChanged(); + } + }); + onAccountSelectionChanged(); + } + + private RemoteServer getSelectedAccount() { + return myAccountSelectionPanel.getSelectedAccount(); + } + + private void onAccountSelectionChanged() { + CardLayout applicationPlaceHolderLayout = (CardLayout)myApplicationPanelPlaceHolder.getLayout(); + + RemoteServer account = getSelectedAccount(); + boolean haveAccount = account != null; + myApplicationPanelPlaceHolder.setVisible(haveAccount); + if (!haveAccount) { + return; + } + + ServerType cloudType = account.getType(); + String cardName = cloudType.getId(); + CloudApplicationConfigurable applicationConfigurable = getApplicationConfigurable(); + if (applicationConfigurable == null) { + applicationConfigurable + = CloudModuleBuilderContribution.getInstanceByType(cloudType).createApplicationConfigurable(myProject, myParentDisposable); + myCloudType2ApplicationConfigurable.put(cloudType, applicationConfigurable); + myApplicationPanelPlaceHolder.add(applicationConfigurable.getComponent(), cardName); + } + applicationPlaceHolderLayout.show(myApplicationPanelPlaceHolder, cardName); + + applicationConfigurable.setAccount(account); + } + + @Override + public JComponent getComponent() { + return myMainPanel; + } + + private CloudApplicationConfigurable getApplicationConfigurable() { + RemoteServer account = getSelectedAccount(); + if (account == null) { + return null; + } + return myCloudType2ApplicationConfigurable.get(account.getType()); + } + + @Override + public void updateDataModel() { + myModuleBuilder.setAccount(myAccountSelectionPanel.getSelectedAccount()); + CloudApplicationConfigurable configurable = getApplicationConfigurable(); + myModuleBuilder.setApplicationConfiguration(configurable == null ? null : configurable.createConfiguration()); + } + + @Override + public boolean validate() throws ConfigurationException { + myAccountSelectionPanel.validate(); + CloudApplicationConfigurable configurable = getApplicationConfigurable(); + if (configurable != null) { + configurable.validate(); + } + return super.validate(); + } +} diff --git a/platform/remote-servers/impl/resources/resources/cloud.properties b/platform/remote-servers/impl/resources/resources/cloud.properties index 82c23fecf0a9..9e55748d88c0 100644 --- a/platform/remote-servers/impl/resources/resources/cloud.properties +++ b/platform/remote-servers/impl/resources/resources/cloud.properties @@ -9,3 +9,5 @@ run.configuration.name={0} - {1} choose.account.title=Choose {0} account\: git.cloud.app.detected={0} application detected at\: {1}.
You may setup deployment run configuration for the application choose.account.wizzard.title={0} deployment run configuration +cloud.support={0} Support +cloud.support.added=Finished adding {0} support\! diff --git a/platform/remote-servers/impl/src/com/intellij/remoteServer/impl/configuration/RemoteServerConfigurable.java b/platform/remote-servers/impl/src/com/intellij/remoteServer/impl/configuration/RemoteServerConfigurable.java index a614c4e642c9..7e68ca4c5b69 100644 --- a/platform/remote-servers/impl/src/com/intellij/remoteServer/impl/configuration/RemoteServerConfigurable.java +++ b/platform/remote-servers/impl/src/com/intellij/remoteServer/impl/configuration/RemoteServerConfigurable.java @@ -7,6 +7,7 @@ import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.Task; import com.intellij.openapi.ui.NamedConfigurable; import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.remoteServer.configuration.RemoteServer; import com.intellij.remoteServer.configuration.ServerConfiguration; import com.intellij.remoteServer.runtime.ServerConnection; @@ -79,7 +80,7 @@ public class RemoteServerConfigurable extends NamedConfigurable> if (result) { myUncheckedApply = false; - setConnectionStatus(""); + setConnectionStatus(false, false, ""); myConnectionTester = null; if (modified) { @@ -88,7 +89,7 @@ public class RemoteServerConfigurable extends NamedConfigurable> myInnerApplied = true; } catch (ConfigurationException e) { - setConnectionStatus(e.getMessage()); + setConnectionStatus(true, false, e.getMessage()); } } } @@ -97,7 +98,7 @@ public class RemoteServerConfigurable extends NamedConfigurable> @Override protected void run() { - setConnectionStatus("Connecting..."); + setConnectionStatus(false, false, "Connecting..."); myConnectionTester = new ConnectionTester(); myConnectionTester.testConnection(); @@ -105,19 +106,20 @@ public class RemoteServerConfigurable extends NamedConfigurable> }; } - private void setConnectionStatus(String text) { - setConnectionStatus(false, text); - } - - private void setConnectionStatus(boolean connected, String text) { + private void setConnectionStatus(boolean error, boolean connected, String text) { boolean changed = myConnected != connected; myConnected = connected; - myConnectionStatusLabel.setText(UIUtil.toHtml(text)); + setConnectionStatusText(error, text); if (changed) { notifyDataLoader(); } } + protected void setConnectionStatusText(boolean error, String text) { + myConnectionStatusLabel.setText(UIUtil.toHtml(text)); + myConnectionStatusLabel.setVisible(StringUtil.isNotEmpty(text)); + } + public void setDataLoader(CloudDataLoader dataLoader) { myDataLoader = dataLoader; notifyDataLoader(); @@ -238,7 +240,7 @@ public class RemoteServerConfigurable extends NamedConfigurable> @Override public void run() { if (myConnectionTester == ConnectionTester.this) { - setConnectionStatus(connected, connected ? "Connection successful" : "Cannot connect: " + connection.getStatusText()); + setConnectionStatus(!connected, connected, connected ? "Connection successful" : "Cannot connect: " + connection.getStatusText()); } } }); From 68de28e0dec03d2e81588aa2cae6e5d78ae3a522 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 21 Jul 2014 14:18:53 +0200 Subject: [PATCH 18/69] use JBColor --- .../com/intellij/ide/actions/ShowStructureSettingsAction.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java/idea-ui/src/com/intellij/ide/actions/ShowStructureSettingsAction.java b/java/idea-ui/src/com/intellij/ide/actions/ShowStructureSettingsAction.java index e3570c2c0fe5..ded07d482ed3 100644 --- a/java/idea-ui/src/com/intellij/ide/actions/ShowStructureSettingsAction.java +++ b/java/idea-ui/src/com/intellij/ide/actions/ShowStructureSettingsAction.java @@ -27,6 +27,7 @@ import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable; import com.intellij.openapi.util.registry.Registry; import com.intellij.ui.Gray; +import com.intellij.ui.JBColor; import com.intellij.ui.border.CustomLineBorder; import org.jetbrains.annotations.Nullable; @@ -55,7 +56,7 @@ public class ShowStructureSettingsAction extends AnAction implements DumbAware { protected JComponent createSouthPanel() { JComponent panel = super.createSouthPanel(); assert panel != null; - CustomLineBorder line = new CustomLineBorder(Gray._153, 1, 0, 0, 0); + CustomLineBorder line = new CustomLineBorder(new JBColor(Gray._153, Gray._80), 1, 0, 0, 0); panel.setBorder(new CompoundBorder(line, new EmptyBorder(10, 5, 5, 5))); return panel; } From f3ffe1aca2012456df83b0afbc707ec1c9395f43 Mon Sep 17 00:00:00 2001 From: Ilya Klyuchnikov Date: Mon, 21 Jul 2014 16:51:01 +0400 Subject: [PATCH 19/69] java-analysis-impl doesn't depend on platform-api --- java/java-analysis-impl/java-analysis-impl.iml | 1 - .../bytecodeAnalysis/BytecodeAnalysisIndex.java | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/java/java-analysis-impl/java-analysis-impl.iml b/java/java-analysis-impl/java-analysis-impl.iml index 28987be6d459..95c129baadfb 100644 --- a/java/java-analysis-impl/java-analysis-impl.iml +++ b/java/java-analysis-impl/java-analysis-impl.iml @@ -18,7 +18,6 @@ - diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisIndex.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisIndex.java index a6aa2ac784e3..6a4b32783c95 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisIndex.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisIndex.java @@ -15,9 +15,9 @@ */ package com.intellij.codeInspection.bytecodeAnalysis; +import com.intellij.ide.highlighter.JavaClassFileType; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileWithId; import com.intellij.util.SystemProperties; @@ -82,7 +82,7 @@ public class BytecodeAnalysisIndex extends FileBasedIndexExtension Date: Mon, 21 Jul 2014 15:05:58 +0200 Subject: [PATCH 20/69] runtime-opcodes support --- .../com/intellij/debugger/jdi/Bytecodes.java | 152 +++++++++++++++++- .../debugger/jdi/InstructionParser.java | 3 +- 2 files changed, 146 insertions(+), 9 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/jdi/Bytecodes.java b/java/debugger/impl/src/com/intellij/debugger/jdi/Bytecodes.java index 86fb655b0853..d6aa2372e720 100644 --- a/java/debugger/impl/src/com/intellij/debugger/jdi/Bytecodes.java +++ b/java/debugger/impl/src/com/intellij/debugger/jdi/Bytecodes.java @@ -232,15 +232,16 @@ class Bytecodes { static { int i; byte[] b = new byte[220]; - String s = "AAAAAAAAAAAAAAAABCLMMDDDDDEEEEEEEEEEEEEEEEEEEEAAAAAAAADD" - + "DDDEEEEEEEEEEEEEEEEEEEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - + "AAAAAAAAAAAAAAAAANAAAAAAAAAAAAAAAAAAAAJJJJJJJJJJJJJJJJDOPAA" - + "AAAAGGGGGGGHIFBFAAFFAARQJJKKJJJJJJJJJJJJJJJJJJ"; - for (i = 0; i < b.length; ++i) { - b[i] = (byte) (s.charAt(i) - 'A'); - } - TYPE = b; + String s = + "AAAAAAAAAAAAAAAABCLMMDDDDDEEEEEEEEEEEEEEEEEEEEAAAAAAAADDDDDEE" + + "EEEEEEEEEEEEEEEEEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + + "AAAAAAAAAANAAAAAAAAAAAAAAAAAAAAJJJJJJJJJJJJJJJJDOPAAAAAAGGGGG" + + "GGHIFBFAAFFAARQJJKKJLMMGGGGGGGGGGGGHGAFFQFFGGG"; + for (i = 0; i < b.length; ++i) { + b[i] = (byte) (s.charAt(i) - 'A'); } + TYPE = b; + } static final int NOP = 0; // visitInsn @@ -446,4 +447,139 @@ class Bytecodes { static final int GOTO_W = 200; // - static final int JSR_W = 201; // - + // JVM runtime-specific and reserved opcodes: + // From JVM specification: + // In addition to the opcodes of the instructions specified later in this chapter, which are used in class files (§4), three opcodes are reserved for internal use by a Java Virtual Machine implementation. If the instruction set of the Java Virtual Machine is extended in the future, these reserved opcodes are guaranteed not to be used. + // Two of the reserved opcodes, numbers 254 (0xfe) and 255 (0xff), have the mnemonics impdep1 and impdep2, respectively. These instructions are intended to provide "back doors" or traps to implementation-specific functionality implemented in software and hardware, respectively. The third reserved opcode, number 202 (0xca), has the mnemonic breakpoint and is intended to be used by debuggers to implement breakpoints. + // Although these opcodes have been reserved, they may be used only inside a Java Virtual Machine implementation. They cannot appear in valid class files. Tools such as debuggers or JIT code generators (§2.13) that might directly interact with Java Virtual Machine code that has been already loaded and executed may encounter these opcodes. Such tools should attempt to behave gracefully if they encounter any of these reserved instructions. + + static final int BREAKPOINT = 202; + static final int LDC_QUICK = 203; + static final int LDC_W_QUICK = 204; + static final int LDC2_W_QUICK = 205; + static final int GETFIELD_QUICK = 206; + static final int PUTFIELD_QUICK = 207; + static final int GETFIELD2_QUICK = 208; + static final int PUTFIELD2_QUICK = 209; + static final int GETSTATIC_QUICK = 210; + static final int PUTSTATIC_QUICK = 211; + static final int GETSTATIC2_QUICK = 212; + static final int PUTSTATIC2_QUICK = 213; + static final int INVOKEVIRTUAL_QUICK = 214; + static final int INVOKENONVIRTUAL_QUICK = 215; + static final int INVOKESUPER_QUICK = 216; + static final int INVOKESTATIC_QUICK = 217; + static final int INVOKEINTERFACE_QUICK = 218; + static final int INVOKEVIRTUALOBJECT_QUICK = 219; + static final int NEW_QUICK = 221; + static final int ANEWARRAY_QUICK = 222; + static final int MULTIANEWARRAY_QUICK = 223; + static final int CHECKCAST_QUICK = 224; + static final int INSTANCEOF_QUICK = 225; + static final int INVOKEVIRTUAL_QUICK_W = 226; + static final int GETFIELD_QUICK_W = 227; + static final int PUTFIELD_QUICK_W = 228; + static final int IMPDEP1 = 254; + static final int IMPDEP2 = 255; + + public static void main(String[] args) { + int[] b = new int[229]; + //code to generate the above string + + // SBYTE_INSN instructions + b[NEWARRAY] = SBYTE_INSN; + b[BIPUSH] = SBYTE_INSN; + + // SHORT_INSN instructions + b[SIPUSH] = SHORT_INSN; + + // (IMPL)VAR_INSN instructions + b[RET] = VAR_INSN; + for (int i = ILOAD; i <= ALOAD; ++i) { + b[i] = VAR_INSN; + } + for (int i = ISTORE; i <= ASTORE; ++i) { + b[i] = VAR_INSN; + } + for (int i = 26; i <= 45; ++i) { // ILOAD_0 to ALOAD_3 + b[i] = IMPLVAR_INSN; + } + for (int i = 59; i <= 78; ++i) { // ISTORE_0 to ASTORE_3 + b[i] = IMPLVAR_INSN; + } + + // TYPE_INSN instructions + b[NEW] = TYPE_INSN; + b[ANEWARRAY] = TYPE_INSN; + b[CHECKCAST] = TYPE_INSN; + b[INSTANCEOF] = TYPE_INSN; + + // (Set)FIELDORMETH_INSN instructions + for (int i = GETSTATIC; i <= INVOKESTATIC; ++i) { + b[i] = FIELDORMETH_INSN; + } + b[INVOKEINTERFACE] = ITFMETH_INSN; + b[INVOKEDYNAMIC] = INDYMETH_INSN; + + // LABEL(W)_INSN instructions + for (int i = IFEQ; i <= JSR; ++i) { + b[i] = LABEL_INSN; + } + b[IFNULL] = LABEL_INSN; + b[IFNONNULL] = LABEL_INSN; + b[GOTO_W] = LABELW_INSN; // GOTO_W + b[JSR_W] = LABELW_INSN; // JSR_W + + b[BREAKPOINT] = LABEL_INSN; // todo: is this correct? + + // LDC(_W) instructions + b[LDC] = LDC_INSN; + b[LDC_W] = LDCW_INSN; // LDC_W + b[LDC2_W] = LDCW_INSN; // LDC2_W + + // special instructions + b[IINC] = IINC_INSN; + b[TABLESWITCH] = TABL_INSN; + b[LOOKUPSWITCH] = LOOK_INSN; + b[MULTIANEWARRAY] = MANA_INSN; + b[WIDE] = WIDE_INSN; // WIDE + + // runtime-specific + + b[LDC_QUICK] = LDC_INSN; // = 203; + b[LDC_W_QUICK] = LDCW_INSN; // = 204; + b[LDC2_W_QUICK] = LDCW_INSN; // = 205; + b[GETFIELD_QUICK] = FIELDORMETH_INSN; // = 206; + b[PUTFIELD_QUICK] = FIELDORMETH_INSN; // = 207; + + b[GETFIELD2_QUICK] = FIELDORMETH_INSN; // = 208; + b[PUTFIELD2_QUICK] = FIELDORMETH_INSN; // = 209; + b[GETSTATIC_QUICK] = FIELDORMETH_INSN; // = 210; + b[PUTSTATIC_QUICK] = FIELDORMETH_INSN; // = 211; + b[GETSTATIC2_QUICK] = FIELDORMETH_INSN; // = 212; + b[PUTSTATIC2_QUICK] = FIELDORMETH_INSN; // = 213; + b[INVOKEVIRTUAL_QUICK] = FIELDORMETH_INSN; // = 214; + b[INVOKENONVIRTUAL_QUICK] = FIELDORMETH_INSN; // = 215; + b[INVOKESUPER_QUICK] = FIELDORMETH_INSN; // = 216; + b[INVOKESTATIC_QUICK] = FIELDORMETH_INSN; // = 217; + b[INVOKEINTERFACE_QUICK] = ITFMETH_INSN; // = 218; + b[INVOKEVIRTUALOBJECT_QUICK] = FIELDORMETH_INSN; // = 219; + b[220] = Bytecodes.NOARG_INSN; // the ID is not used for any opcode + b[NEW_QUICK] = TYPE_INSN; // = 221; + b[ANEWARRAY_QUICK] = TYPE_INSN; // = 222; + b[MULTIANEWARRAY_QUICK] = MANA_INSN; // = 223; + b[CHECKCAST_QUICK] = TYPE_INSN; // = 224; + b[INSTANCEOF_QUICK] = TYPE_INSN; // = 225; + b[INVOKEVIRTUAL_QUICK_W] = FIELDORMETH_INSN; // = 226; + b[GETFIELD_QUICK_W] = FIELDORMETH_INSN; // = 227; + b[PUTFIELD_QUICK_W] = FIELDORMETH_INSN; // = 228; + + + for (int i = 0; i < b.length; ++i) { + System.err.print((char)('A' + b[i])); + } + System.err.println(); + + } + } diff --git a/java/debugger/impl/src/com/intellij/debugger/jdi/InstructionParser.java b/java/debugger/impl/src/com/intellij/debugger/jdi/InstructionParser.java index b8053a891d42..78bf10fe7e40 100644 --- a/java/debugger/impl/src/com/intellij/debugger/jdi/InstructionParser.java +++ b/java/debugger/impl/src/com/intellij/debugger/jdi/InstructionParser.java @@ -38,7 +38,8 @@ public class InstructionParser { break; } int opcode = myCode[v] & 0xFF; - switch (Bytecodes.TYPE[opcode]) { + final byte opcodeType = opcode == Bytecodes.IMPDEP1 || opcode == Bytecodes.IMPDEP2? Bytecodes.NOARG_INSN : Bytecodes.TYPE[opcode]; + switch (opcodeType) { case Bytecodes.NOARG_INSN: v += 1; break; From 4d7f4abc95d3a4bb04a589bc71cdbcc61fc26d54 Mon Sep 17 00:00:00 2001 From: Evgeny Pasynkov Date: Mon, 21 Jul 2014 15:46:30 +0200 Subject: [PATCH 21/69] move PropertiesComponentImpl to core-impl --- .../src/com/intellij/ide/util/PropertiesComponentImpl.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename platform/{platform-impl => core-impl}/src/com/intellij/ide/util/PropertiesComponentImpl.java (100%) diff --git a/platform/platform-impl/src/com/intellij/ide/util/PropertiesComponentImpl.java b/platform/core-impl/src/com/intellij/ide/util/PropertiesComponentImpl.java similarity index 100% rename from platform/platform-impl/src/com/intellij/ide/util/PropertiesComponentImpl.java rename to platform/core-impl/src/com/intellij/ide/util/PropertiesComponentImpl.java From 322e539fc587831fa8015314dc8456b3de6beec1 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 21 Jul 2014 16:08:23 +0200 Subject: [PATCH 22/69] IDEA-127077 (highlighting test) --- .../daemonCodeAnalyzer/annotations/typeAnnotations.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/annotations/typeAnnotations.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/annotations/typeAnnotations.java index 28035c8c1698..01f7486ea89a 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/annotations/typeAnnotations.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/annotations/typeAnnotations.java @@ -114,6 +114,7 @@ class Outer { void @TA misplaced() { } @TA Outer() { } + @TA Outer(T t) { } class MyClass<@TA @TPA T> { } interface MyInterface<@TA @TPA E> { } From 31d8039eb69622a9376d0dcc902a0c6ae369dc0c Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 21 Jul 2014 10:23:45 +0200 Subject: [PATCH 23/69] cleanup --- .../DebuggerDataViewsConfigurable.java | 18 ++++++++++++++++-- .../src/messages/DebuggerBundle.properties | 4 ++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java index db01e13836ef..0a57184bc456 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java @@ -71,16 +71,19 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { myArrayRendererConfigurable = new ArrayRendererConfigurable(NodeRendererSettings.getInstance().getArrayRenderer()); } + @Override public void disposeUIResources() { myArrayRendererConfigurable.disposeUIResources(); myToStringFilterEditor = null; myProject = null; } + @Override public String getDisplayName() { return DebuggerBundle.message("base.renderer.configurable.display.name"); } + @Override public JComponent createComponent() { if (myProject == null) { myProject = JavaDebuggerSupport.getContextProjectForEditorFieldsInDebuggerConfigurables(); @@ -97,6 +100,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { myCbEnableAlternateViews = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.alternate.view")); myCbEnableAutoExpressions = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.auto.expressions")); myCbShowStatic.addChangeListener(new ChangeListener(){ + @Override public void stateChanged(ChangeEvent e) { if(myCbShowStatic.isSelected()) { myCbShowStaticFinalFields.makeSelectable(); @@ -121,14 +125,15 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { myCbShowFQNames = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.fq.names")); myCbShowObjectId = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.object.id")); - myCbEnableToString = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.enable.tostring")); - myRbAllThatOverride = new JRadioButton(DebuggerBundle.message("label.base.renderer.configurable.all.overridding")); + myCbEnableToString = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.enable.toString")); + myRbAllThatOverride = new JRadioButton(DebuggerBundle.message("label.base.renderer.configurable.all.overriding")); myRbFromList = new JRadioButton(DebuggerBundle.message("label.base.renderer.configurable.classes.from.list")); ButtonGroup group = new ButtonGroup(); group.add(myRbAllThatOverride); group.add(myRbFromList); myToStringFilterEditor = new ClassFilterEditor(myProject, null, "reference.viewBreakpoints.classFilters.newPattern"); myCbEnableToString.addItemListener(new ItemListener() { + @Override public void itemStateChanged(ItemEvent e) { final boolean enabled = myCbEnableToString.isSelected(); myRbAllThatOverride.setEnabled(enabled); @@ -137,6 +142,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { } }); myRbFromList.addItemListener(new ItemListener() { + @Override public void itemStateChanged(ItemEvent e) { myToStringFilterEditor.setEnabled(myCbEnableToString.isSelected() && myRbFromList.isSelected()); } @@ -174,6 +180,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { final JPanel arraysPanel = new JPanel(new BorderLayout(0, UIUtil.DEFAULT_VGAP)); final JComponent arraysComponent = myArrayRendererConfigurable.createComponent(); + assert arraysComponent != null; arraysPanel.add(arraysComponent, BorderLayout.CENTER); arraysPanel.add(myCbHideNullArrayElements, BorderLayout.SOUTH); arraysPanel.setBorder(IdeBorderFactory.createTitledBorder("Arrays", true)); @@ -191,6 +198,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { return panel; } + @Override public void apply() { final ViewsGeneralSettings generalSettings = ViewsGeneralSettings.getInstance(); final NodeRendererSettings rendererSettings = NodeRendererSettings.getInstance(); @@ -227,6 +235,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { rendererSettings.fireRenderersChanged(); } + @Override public void reset() { final ViewsGeneralSettings generalSettings = ViewsGeneralSettings.getInstance(); final NodeRendererSettings rendererSettings = NodeRendererSettings.getInstance(); @@ -268,6 +277,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { myArrayRendererConfigurable.reset(); } + @Override public boolean isModified() { return areGeneralSettingsModified() || areDefaultRenderersModified() || areDebuggerSettingsModified(); } @@ -325,16 +335,20 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { return false; } + @SuppressWarnings("SpellCheckingInspection") + @Override @NotNull public String getHelpTopic() { return "reference.idesettings.debugger.dataviews"; } + @Override @NotNull public String getId() { return getHelpTopic(); } + @Override public Runnable enableSearch(String option) { return null; } diff --git a/resources-en/src/messages/DebuggerBundle.properties b/resources-en/src/messages/DebuggerBundle.properties index ff3238c7dab2..d67c19a81788 100644 --- a/resources-en/src/messages/DebuggerBundle.properties +++ b/resources-en/src/messages/DebuggerBundle.properties @@ -188,8 +188,8 @@ label.base.renderer.configurable.show.fq.names=Fully &qualified names label.base.renderer.configurable.show.object.id=Object &id label.base.renderer.configurable.auto.expressions=Enable auto expressions in Variables view label.base.renderer.configurable.alternate.view=Enable alternative view for Coll&ections classes -label.base.renderer.configurable.enable.tostring=Enable 't&oString()' object view: -label.base.renderer.configurable.all.overridding=For all classes that override 'toString()' method +label.base.renderer.configurable.enable.toString=Enable 't&oString()' object view: +label.base.renderer.configurable.all.overriding=For all classes that override 'toString()' method label.base.renderer.configurable.classes.from.list=For classes from the list: label.compound.renderer.configurable.use.default.renderer=Use default renderer label.compound.renderer.configurable.use.expression=Use following expression: From 30c72646dc05eb297303380e1726981c83c37f07 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 21 Jul 2014 10:55:10 +0200 Subject: [PATCH 24/69] cleanup --- .../DebuggerDataViewsConfigurable.java | 5 +++-- .../options/SearchableConfigurable.java | 10 ++++++++- .../src/messages/XDebuggerBundle.properties | 5 ++++- .../intellij/xdebugger/XDebuggerBundle.java | 1 - .../impl/settings/DebuggerConfigurable.java | 21 +++++++++++++++---- .../DebuggerConfigurableProvider.java | 7 ++++--- .../src/messages/DebuggerBundle.properties | 2 -- 7 files changed, 37 insertions(+), 14 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java index 0a57184bc456..31fac95beeb4 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java @@ -28,6 +28,7 @@ import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.StateRestoringCheckBox; import com.intellij.ui.classFilter.ClassFilterEditor; import com.intellij.util.ui.UIUtil; +import com.intellij.xdebugger.XDebuggerBundle; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -98,7 +99,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { myCbShowStatic = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.static.fields")); myCbShowStaticFinalFields = new StateRestoringCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.static.final.fields")); myCbEnableAlternateViews = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.alternate.view")); - myCbEnableAutoExpressions = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.auto.expressions")); + myCbEnableAutoExpressions = new JCheckBox(XDebuggerBundle.message("setting.enable.auto.expressions.label")); myCbShowStatic.addChangeListener(new ChangeListener(){ @Override public void stateChanged(ChangeEvent e) { @@ -158,7 +159,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { Registry.stringValue("ide.forcedShowTooltip"))); panel.add(myAutoTooltip, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 0, 0, 0), 0, 0)); - final JLabel tooltipLabel = new JLabel(DebuggerBundle.message("label.debugger.general.configurable.tooltips.delay")); + final JLabel tooltipLabel = new JLabel(XDebuggerBundle.message("setting.value.tooltip.delay.label")); panel.add(tooltipLabel, new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 0, 0, 0), 0, 0)); myValueTooltipDelayField = new JTextField(10); myValueTooltipDelayField.setMinimumSize(new Dimension(50, myValueTooltipDelayField.getPreferredSize().height)); diff --git a/platform/platform-api/src/com/intellij/openapi/options/SearchableConfigurable.java b/platform/platform-api/src/com/intellij/openapi/options/SearchableConfigurable.java index 634144817fa7..e98bb05aba99 100644 --- a/platform/platform-api/src/com/intellij/openapi/options/SearchableConfigurable.java +++ b/platform/platform-api/src/com/intellij/openapi/options/SearchableConfigurable.java @@ -36,41 +36,49 @@ public interface SearchableConfigurable extends Configurable { boolean hasOwnContent(); boolean isVisible(); - abstract class Abstract implements Parent { private Configurable[] myKids; + @Override public JComponent createComponent() { return null; } + @Override public boolean hasOwnContent() { return false; } + @Override public boolean isModified() { return false; } + @Override public void apply() throws ConfigurationException { } + @Override public void reset() { } + @Override public void disposeUIResources() { myKids = null; } + @Override public Runnable enableSearch(final String option) { return null; } + @Override public boolean isVisible() { return true; } + @Override public final Configurable[] getConfigurables() { if (myKids != null) return myKids; myKids = buildConfigurables(); diff --git a/platform/platform-resources-en/src/messages/XDebuggerBundle.properties b/platform/platform-resources-en/src/messages/XDebuggerBundle.properties index cdfe93846513..5a4e1802dc6a 100644 --- a/platform/platform-resources-en/src/messages/XDebuggerBundle.properties +++ b/platform/platform-resources-en/src/messages/XDebuggerBundle.properties @@ -111,4 +111,7 @@ scope.catch = Catch scope.class = Class scope.instance = Instance scope.library = Library -scope.unknown = Unknown \ No newline at end of file +scope.unknown = Unknown + +setting.value.tooltip.delay.label=&Value tooltip delay (ms): +setting.enable.auto.expressions.label=Enable auto expressions in Variables view \ No newline at end of file diff --git a/platform/xdebugger-api/src/com/intellij/xdebugger/XDebuggerBundle.java b/platform/xdebugger-api/src/com/intellij/xdebugger/XDebuggerBundle.java index a9594ca27ba7..23a262c32654 100644 --- a/platform/xdebugger-api/src/com/intellij/xdebugger/XDebuggerBundle.java +++ b/platform/xdebugger-api/src/com/intellij/xdebugger/XDebuggerBundle.java @@ -29,7 +29,6 @@ import java.util.ResourceBundle; * @author nik */ public class XDebuggerBundle { - public static String message(@NotNull @PropertyKey(resourceBundle = BUNDLE) String key, @NotNull Object... params) { return CommonBundle.message(getBundle(), key, params); } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java index ae0b71eaa20f..b72115df0a5e 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java @@ -22,6 +22,7 @@ import com.intellij.xdebugger.XDebuggerBundle; import com.intellij.xdebugger.impl.DebuggerSupport; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.List; @@ -31,26 +32,30 @@ import java.util.List; */ public class DebuggerConfigurable implements SearchableConfigurable.Parent { public static final String DISPLAY_NAME = XDebuggerBundle.message("debugger.configurable.display.name"); - private Configurable myRootConfigurable; - private Configurable[] myChildren; + private final Configurable myRootConfigurable; + private final Configurable[] myChildren; - public DebuggerConfigurable(Configurable rootConfigurable, List children) { + public DebuggerConfigurable(@Nullable Configurable rootConfigurable, @NotNull List children) { myRootConfigurable = rootConfigurable; myChildren = children.toArray(new Configurable[children.size()]); } + @Override public String getDisplayName() { return DISPLAY_NAME; } + @Override public String getHelpTopic() { - return myRootConfigurable != null? myRootConfigurable.getHelpTopic() : null; + return myRootConfigurable != null ? myRootConfigurable.getHelpTopic() : null; } + @Override public Configurable[] getConfigurables() { return myChildren; } + @Override public void apply() throws ConfigurationException { for (DebuggerSupport support : DebuggerSupport.getDebuggerSupports()) { support.getSettingsPanelProvider().apply(); @@ -60,38 +65,46 @@ public class DebuggerConfigurable implements SearchableConfigurable.Parent { } } + @Override public boolean hasOwnContent() { return myRootConfigurable != null; } + @Override public boolean isVisible() { return true; } + @Override public Runnable enableSearch(final String option) { return null; } + @Override public JComponent createComponent() { return myRootConfigurable != null ? myRootConfigurable.createComponent() : null; } + @Override public boolean isModified() { return myRootConfigurable != null && myRootConfigurable.isModified(); } + @Override public void reset() { if (myRootConfigurable != null) { myRootConfigurable.reset(); } } + @Override public void disposeUIResources() { if (myRootConfigurable != null) { myRootConfigurable.disposeUIResources(); } } + @Override @NotNull @NonNls public String getId() { diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java index 49e2e4ac6fcd..12f44d0fe4cc 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java @@ -18,6 +18,7 @@ package com.intellij.xdebugger.impl.settings; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurableProvider; import com.intellij.util.PlatformUtils; +import com.intellij.util.SmartList; import com.intellij.xdebugger.impl.DebuggerSupport; import java.util.ArrayList; @@ -31,14 +32,14 @@ import java.util.List; public class DebuggerConfigurableProvider extends ConfigurableProvider { @Override public Configurable createConfigurable() { - final List providers = new ArrayList(); - final DebuggerSupport[] supports = DebuggerSupport.getDebuggerSupports(); - for (DebuggerSupport support : supports) { + List providers = new SmartList(); + for (DebuggerSupport support : DebuggerSupport.getDebuggerSupports()) { providers.add(support.getSettingsPanelProvider()); } List configurables = new ArrayList(); Collections.sort(providers, new Comparator() { + @Override public int compare(final DebuggerSettingsPanelProvider o1, final DebuggerSettingsPanelProvider o2) { return o2.getPriority() - o1.getPriority(); } diff --git a/resources-en/src/messages/DebuggerBundle.properties b/resources-en/src/messages/DebuggerBundle.properties index d67c19a81788..f59b89d160c4 100644 --- a/resources-en/src/messages/DebuggerBundle.properties +++ b/resources-en/src/messages/DebuggerBundle.properties @@ -186,7 +186,6 @@ label.base.renderer.configurable.show.static.final.fields=Static &final fields label.base.renderer.configurable.show.declared.type=Declared &type label.base.renderer.configurable.show.fq.names=Fully &qualified names label.base.renderer.configurable.show.object.id=Object &id -label.base.renderer.configurable.auto.expressions=Enable auto expressions in Variables view label.base.renderer.configurable.alternate.view=Enable alternative view for Coll&ections classes label.base.renderer.configurable.enable.toString=Enable 't&oString()' object view: label.base.renderer.configurable.all.overriding=For all classes that override 'toString()' method @@ -214,7 +213,6 @@ label.debugger.focusAppOnBreakpoint=Focus application on breakpoint label.debugger.hotswap.configurable.hotswap.background=Reload classes in &background label.debugger.hotswap.configurable.compile.before.hotswap=Make project before reloading classes label.debugger.hotswap.configurable.enable.vm.hang.warning=Enable 'JVM will hang' warning -label.debugger.general.configurable.tooltips.delay=&Value tooltips delay (ms): label.debugger.hotswap.configurable.reload.classes=Reload classes after compilation: label.debugger.hotswap.configurable.always=&Always label.debugger.hotswap.configurable.never=&Never From 90cc9e38f43663d9082ff6f5fd4744cd5e63b220 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 21 Jul 2014 12:18:08 +0200 Subject: [PATCH 25/69] cleanup --- .../debugger/ui/tree/render/ClassRenderer.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java index bd14ef55b054..c1e98c428a57 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java @@ -83,22 +83,27 @@ public class ClassRenderer extends NodeRendererImpl{ return typeName; } + @Override public String getUniqueId() { return UNIQUE_ID; } + @Override public boolean isEnabled() { return myProperties.isEnabled(); } + @Override public void setEnabled(boolean enabled) { myProperties.setEnabled(enabled); } + @Override public ClassRenderer clone() { return (ClassRenderer) super.clone(); } + @Override public String calcLabel(ValueDescriptor descriptor, EvaluationContext evaluationContext, DescriptorLabelListener labelListener) throws EvaluateException { return calcLabel(descriptor); } @@ -151,6 +156,7 @@ public class ClassRenderer extends NodeRendererImpl{ } } + @Override public void buildChildren(final Value value, final ChildrenBuilder builder, final EvaluationContext evaluationContext) { DebuggerManagerThreadImpl.assertIsManagerThread(); final ValueDescriptorImpl parentDescriptor = (ValueDescriptorImpl)builder.getParentDescriptor(); @@ -211,16 +217,19 @@ public class ClassRenderer extends NodeRendererImpl{ return true; } + @Override public void readExternal(Element element) throws InvalidDataException { super.readExternal(element); DefaultJDOMExternalizer.readExternal(this, element); } + @Override public void writeExternal(Element element) throws WriteExternalException { super.writeExternal(element); DefaultJDOMExternalizer.writeExternal(this, element); } + @Override public PsiExpression getChildValueExpression(DebuggerTreeNode node, DebuggerContext context) throws EvaluateException { FieldDescriptor fieldDescriptor = (FieldDescriptor)node.getDescriptor(); @@ -251,19 +260,23 @@ public class ClassRenderer extends NodeRendererImpl{ return false; } + @Override public boolean isExpandable(Value value, EvaluationContext evaluationContext, NodeDescriptor parentDescriptor) { DebuggerManagerThreadImpl.assertIsManagerThread(); return valueExpandable(value); } + @Override public boolean isApplicable(Type type) { return type instanceof ReferenceType && !(type instanceof ArrayType); } + @Override public @NonNls String getName() { return "Object"; } + @Override public void setName(String text) { LOG.assertTrue(false); } From 343e145f836670bddf693bcda748f1db273c9335 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 21 Jul 2014 12:30:39 +0200 Subject: [PATCH 26/69] cleanup --- .../intellij/debugger/settings/ViewsGeneralSettings.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/ViewsGeneralSettings.java b/java/debugger/impl/src/com/intellij/debugger/settings/ViewsGeneralSettings.java index 8518e8258519..eaf3a09c67be 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/ViewsGeneralSettings.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/ViewsGeneralSettings.java @@ -41,22 +41,22 @@ public class ViewsGeneralSettings implements PersistentStateComponent { return ServiceManager.getService(ViewsGeneralSettings.class); } + @Override public void loadState(Element element) { try { DefaultJDOMExternalizer.readExternal(this, element); } - catch (InvalidDataException e) { - // ignore + catch (InvalidDataException ignored) { } } + @Override public Element getState() { Element element = new Element("ViewsGeneralSettings"); try { DefaultJDOMExternalizer.writeExternal(this, element); } - catch (WriteExternalException e) { - // ignore + catch (WriteExternalException ignored) { } return element; } From e6d092e65add1a7c2babb675648f8c4c0eb38779 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 21 Jul 2014 12:38:31 +0200 Subject: [PATCH 27/69] cleanup --- .../src/com/intellij/debugger/ui/impl/TipManager.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/TipManager.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/TipManager.java index fce05d1f23db..f063ac9382be 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/TipManager.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/TipManager.java @@ -117,14 +117,17 @@ public class TipManager implements Disposable, PopupMenuListener { return menu; } + @Override public void popupMenuWillBecomeVisible(final PopupMenuEvent e) { myPopupShown = true; } + @Override public void popupMenuWillBecomeInvisible(final PopupMenuEvent e) { onPopupClosed(e); } + @Override public void popupMenuCanceled(final PopupMenuEvent e) { onPopupClosed(e); } @@ -174,6 +177,7 @@ public class TipManager implements Disposable, PopupMenuListener { myShowAlarm.cancelAllRequests(); myHideAlarm.cancelAllRequests(); myShowAlarm.addRequest(new Runnable() { + @Override public void run() { if (!myIsDisposed && !myPopupShown) { showTooltip(e, auto); @@ -245,6 +249,7 @@ public class TipManager implements Disposable, PopupMenuListener { myCurrentTooltip = null; } else { myHideAlarm.addRequest(new Runnable() { + @Override public void run() { if (myInsideComponent) { hideTooltip(true); @@ -273,10 +278,12 @@ public class TipManager implements Disposable, PopupMenuListener { myComponent = component; new UiNotifyConnector.Once(component, new Activatable() { + @Override public void showNotify() { installListeners(); } + @Override public void hideNotify() { } }); @@ -284,6 +291,7 @@ public class TipManager implements Disposable, PopupMenuListener { final HideTooltipAction hide = new HideTooltipAction(); hide.registerCustomShortcutSet(new CustomShortcutSet(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0)), myComponent); Disposer.register(this, new Disposable() { + @Override public void dispose() { hide.unregisterCustomShortcutSet(myComponent); } @@ -292,6 +300,7 @@ public class TipManager implements Disposable, PopupMenuListener { private class HideTooltipAction extends AnAction { + @Override public void actionPerformed(AnActionEvent e) { hideTooltip(true); } @@ -316,6 +325,7 @@ public class TipManager implements Disposable, PopupMenuListener { FrameStateManager.getInstance().addListener(myFrameStateListener); } + @Override public void dispose() { Disposer.dispose(this); @@ -333,6 +343,7 @@ public class TipManager implements Disposable, PopupMenuListener { private class MyAwtPreprocessor implements AWTEventListener { + @Override public void eventDispatched(AWTEvent event) { if (event.getID() == MouseEvent.MOUSE_MOVED) { preventFromHideIfInsideTooltip(event); From 27fddc26085e835a65ec0015e6da62e586683488 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 21 Jul 2014 14:47:54 +0200 Subject: [PATCH 28/69] =?UTF-8?q?generic=20debugger=20settings:=20step=201?= =?UTF-8?q?=20=E2=80=94=20data=20views?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../actions/QuickEvaluateActionHandler.java | 4 +- .../debugger/engine/JavaStackFrame.java | 4 +- .../DebuggerDataViewsConfigurable.java | 44 +-------- .../debugger/settings/DebuggerSettings.java | 2 - .../settings/ViewsGeneralSettings.java | 1 - .../debugger/ui/JavaDebuggerSupport.java | 25 ++++- .../debugger/ui/impl/FrameVariablesTree.java | 5 +- .../intellij/debugger/ui/impl/TipManager.java | 4 +- .../debugger/ui/impl/watch/DebuggerTree.java | 3 +- .../ui/tree/render/ClassRenderer.java | 4 +- .../src/messages/XDebuggerBundle.properties | 4 +- .../src/META-INF/xdebugger.xml | 2 +- .../util/src/com/intellij/util/ui/UIUtil.java | 18 ++++ .../evaluation/XDebuggerEvaluator.java | 3 +- .../xdebugger/settings/XDebuggerSettings.java | 12 ++- .../settings/XDebuggerSettingsManager.java | 21 ++++ .../xdebugger/impl/XDebugSessionImpl.java | 2 +- .../xdebugger/impl/XDebuggerUtilImpl.java | 2 +- .../impl/actions/UnmuteOnStopAction.java | 4 +- .../evaluate/XDebuggerEvaluationDialog.java | 4 +- .../evaluate/quick/XQuickEvaluateHandler.java | 3 +- .../impl/settings/DataViewsConfigurable.java | 99 +++++++++++++++++++ .../settings/DataViewsConfigurableUi.form | 50 ++++++++++ .../settings/DataViewsConfigurableUi.java | 46 +++++++++ .../DebuggerConfigurableProvider.java | 55 +++++++++-- .../DebuggerSettingsPanelProvider.java | 24 ++++- .../settings/XDebuggerDataViewSettings.java | 30 +++++- .../settings/XDebuggerSettingsManager.java | 13 ++- .../XDebuggerSettingsPanelProviderImpl.java | 34 +++++-- .../tree/actions/SortValuesToggleAction.java | 4 +- .../ui/tree/nodes/XValueContainerNode.java | 2 +- .../xdebugger/XDebuggerSettingsTest.java | 4 +- .../src/messages/DebuggerBundle.properties | 1 - 33 files changed, 432 insertions(+), 101 deletions(-) create mode 100644 platform/xdebugger-api/src/com/intellij/xdebugger/settings/XDebuggerSettingsManager.java create mode 100644 platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurable.java create mode 100644 platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurableUi.form create mode 100644 platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurableUi.java diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/QuickEvaluateActionHandler.java b/java/debugger/impl/src/com/intellij/debugger/actions/QuickEvaluateActionHandler.java index 6eedff4136ea..2696f226e412 100644 --- a/java/debugger/impl/src/com/intellij/debugger/actions/QuickEvaluateActionHandler.java +++ b/java/debugger/impl/src/com/intellij/debugger/actions/QuickEvaluateActionHandler.java @@ -22,13 +22,13 @@ package com.intellij.debugger.actions; import com.intellij.debugger.DebuggerManagerEx; import com.intellij.debugger.impl.DebuggerSession; -import com.intellij.debugger.settings.DebuggerSettings; import com.intellij.debugger.ui.ValueHint; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.xdebugger.impl.evaluate.quick.common.AbstractValueHint; import com.intellij.xdebugger.impl.evaluate.quick.common.QuickEvaluateHandler; import com.intellij.xdebugger.impl.evaluate.quick.common.ValueHintType; +import com.intellij.xdebugger.settings.XDebuggerSettingsManager; import org.jetbrains.annotations.NotNull; import java.awt.*; @@ -53,6 +53,6 @@ public class QuickEvaluateActionHandler extends QuickEvaluateHandler { @Override public int getValueLookupDelay(final Project project) { - return DebuggerSettings.getInstance().VALUE_LOOKUP_DELAY; + return XDebuggerSettingsManager.getInstance().getDataViewSettings().getValueLookupDelay(); } } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java index 56496b9aa1ca..bcd8257736c2 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java @@ -27,7 +27,6 @@ import com.intellij.debugger.impl.DebuggerUtilsEx; import com.intellij.debugger.jdi.*; import com.intellij.debugger.settings.DebuggerSettings; import com.intellij.debugger.settings.NodeRendererSettings; -import com.intellij.debugger.settings.ViewsGeneralSettings; import com.intellij.debugger.ui.breakpoints.Breakpoint; import com.intellij.debugger.ui.impl.FrameVariablesTree; import com.intellij.debugger.ui.impl.watch.*; @@ -47,6 +46,7 @@ import com.intellij.xdebugger.frame.XCompositeNode; import com.intellij.xdebugger.frame.XStackFrame; import com.intellij.xdebugger.frame.XValueChildrenList; import com.intellij.xdebugger.impl.ui.XDebuggerUIConstants; +import com.intellij.xdebugger.settings.XDebuggerSettingsManager; import com.sun.jdi.*; import com.sun.jdi.event.Event; import com.sun.jdi.event.ExceptionEvent; @@ -271,7 +271,7 @@ public class JavaStackFrame extends XStackFrame { } try { - if (!ViewsGeneralSettings.getInstance().ENABLE_AUTO_EXPRESSIONS && !myAutoWatchMode) { + if (!XDebuggerSettingsManager.getInstance().getDataViewSettings().isAutoExpressions() && !myAutoWatchMode) { // optimization superBuildVariables(evaluationContext, children); } diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java index 31fac95beeb4..09c99729864b 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java @@ -20,6 +20,7 @@ import com.intellij.debugger.impl.DebuggerUtilsEx; import com.intellij.debugger.ui.JavaDebuggerSupport; import com.intellij.debugger.ui.tree.render.ClassRenderer; import com.intellij.debugger.ui.tree.render.ToStringRenderer; +import com.intellij.openapi.options.OptionsBundle; import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.registry.Registry; @@ -28,7 +29,6 @@ import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.StateRestoringCheckBox; import com.intellij.ui.classFilter.ClassFilterEditor; import com.intellij.util.ui.UIUtil; -import com.intellij.xdebugger.XDebuggerBundle; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -46,7 +46,6 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { private JCheckBox myCbAutoscroll; private JCheckBox myCbShowSyntheticFields; private StateRestoringCheckBox myCbShowValFieldsAsLocalVariables; - private JCheckBox myCbSort; private JCheckBox myCbHideNullArrayElements; private JCheckBox myCbShowStatic; private JCheckBox myCbShowDeclaredType; @@ -55,15 +54,13 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { private StateRestoringCheckBox myCbShowStaticFinalFields; private final ArrayRendererConfigurable myArrayRendererConfigurable; - private JCheckBox myCbEnableAutoExpressions; private JCheckBox myCbEnableAlternateViews; private JCheckBox myCbEnableToString; private JRadioButton myRbAllThatOverride; private JRadioButton myRbFromList; private ClassFilterEditor myToStringFilterEditor; - private JTextField myValueTooltipDelayField; - + private Project myProject; private RegistryCheckBox myAutoTooltip; @@ -81,7 +78,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { @Override public String getDisplayName() { - return DebuggerBundle.message("base.renderer.configurable.display.name"); + return OptionsBundle.message("options.java.display.name"); } @Override @@ -94,12 +91,10 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { myCbAutoscroll = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.autoscroll")); myCbShowSyntheticFields = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.synthetic.fields")); myCbShowValFieldsAsLocalVariables = new StateRestoringCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.val.fields.as.locals")); - myCbSort = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.sort.alphabetically")); myCbHideNullArrayElements = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.hide.null.array.elements")); myCbShowStatic = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.static.fields")); myCbShowStaticFinalFields = new StateRestoringCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.static.final.fields")); myCbEnableAlternateViews = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.alternate.view")); - myCbEnableAutoExpressions = new JCheckBox(XDebuggerBundle.message("setting.enable.auto.expressions.label")); myCbShowStatic.addChangeListener(new ChangeListener(){ @Override public void stateChanged(ChangeEvent e) { @@ -149,7 +144,6 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { } }); - panel.add(myCbSort, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); panel.add(myCbAutoscroll, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 0, 0, 0), 0, 0)); @@ -158,14 +152,6 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { DebuggerBundle.message("label.base.renderer.configurable.autoTooltip.description", Registry.stringValue("ide.forcedShowTooltip"))); panel.add(myAutoTooltip, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 0, 0, 0), 0, 0)); - - final JLabel tooltipLabel = new JLabel(XDebuggerBundle.message("setting.value.tooltip.delay.label")); - panel.add(tooltipLabel, new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 0, 0, 0), 0, 0)); - myValueTooltipDelayField = new JTextField(10); - myValueTooltipDelayField.setMinimumSize(new Dimension(50, myValueTooltipDelayField.getPreferredSize().height)); - panel.add(myValueTooltipDelayField, new GridBagConstraints(2, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 0, 0, 0), 0, 0)); - tooltipLabel.setLabelFor(myValueTooltipDelayField); - final JPanel showPanel = new JPanel(new GridBagLayout()); showPanel.setBorder(IdeBorderFactory.createTitledBorder("Show", true)); @@ -187,7 +173,6 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { arraysPanel.setBorder(IdeBorderFactory.createTitledBorder("Arrays", true)); panel.add(arraysPanel, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 3, 1, 1.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); - panel.add(myCbEnableAutoExpressions, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 10), 0, 0)); panel.add(myCbEnableAlternateViews, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 0, 0, 10), 0, 0)); // starting 4-th row panel.add(myCbEnableToString, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 3, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 0, 0, 0), 0, 0)); @@ -204,18 +189,11 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { final ViewsGeneralSettings generalSettings = ViewsGeneralSettings.getInstance(); final NodeRendererSettings rendererSettings = NodeRendererSettings.getInstance(); - try { - DebuggerSettings.getInstance().VALUE_LOOKUP_DELAY = Integer.parseInt(myValueTooltipDelayField.getText().trim()); - } - catch (NumberFormatException ignored) { - } generalSettings.AUTOSCROLL_TO_NEW_LOCALS = myCbAutoscroll.isSelected(); rendererSettings.setAlternateCollectionViewsEnabled(myCbEnableAlternateViews.isSelected()); generalSettings.HIDE_NULL_ARRAY_ELEMENTS = myCbHideNullArrayElements.isSelected(); - generalSettings.ENABLE_AUTO_EXPRESSIONS = myCbEnableAutoExpressions.isSelected(); final ClassRenderer classRenderer = rendererSettings.getClassRenderer(); - classRenderer.SORT_ASCENDING = myCbSort.isSelected(); classRenderer.SHOW_STATIC = myCbShowStatic.isSelected(); classRenderer.SHOW_STATIC_FINAL = myCbShowStaticFinalFields.isSelectedWhenSelectable(); classRenderer.SHOW_SYNTHETICS = myCbShowSyntheticFields.isSelected(); @@ -241,11 +219,9 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { final ViewsGeneralSettings generalSettings = ViewsGeneralSettings.getInstance(); final NodeRendererSettings rendererSettings = NodeRendererSettings.getInstance(); - myValueTooltipDelayField.setText(Integer.toString(DebuggerSettings.getInstance().VALUE_LOOKUP_DELAY)); myCbAutoscroll.setSelected(generalSettings.AUTOSCROLL_TO_NEW_LOCALS); myCbHideNullArrayElements.setSelected(generalSettings.HIDE_NULL_ARRAY_ELEMENTS); myCbEnableAlternateViews.setSelected(rendererSettings.areAlternateCollectionViewsEnabled()); - myCbEnableAutoExpressions.setSelected(generalSettings.ENABLE_AUTO_EXPRESSIONS); ClassRenderer classRenderer = rendererSettings.getClassRenderer(); @@ -254,7 +230,6 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { if (!classRenderer.SHOW_SYNTHETICS) { myCbShowValFieldsAsLocalVariables.makeUnselectable(false); } - myCbSort.setSelected(classRenderer.SORT_ASCENDING); myCbShowStatic.setSelected(classRenderer.SHOW_STATIC); myCbShowStaticFinalFields.setSelected(classRenderer.SHOW_STATIC_FINAL); if(!classRenderer.SHOW_STATIC) { @@ -280,23 +255,13 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { @Override public boolean isModified() { - return areGeneralSettingsModified() || areDefaultRenderersModified() || areDebuggerSettingsModified(); - } - - private boolean areDebuggerSettingsModified() { - try { - return DebuggerSettings.getInstance().VALUE_LOOKUP_DELAY != Integer.parseInt(myValueTooltipDelayField.getText().trim()); - } - catch (NumberFormatException ignored) { - } - return false; + return areGeneralSettingsModified() || areDefaultRenderersModified(); } private boolean areGeneralSettingsModified() { ViewsGeneralSettings generalSettings = ViewsGeneralSettings.getInstance(); return (generalSettings.AUTOSCROLL_TO_NEW_LOCALS != myCbAutoscroll.isSelected()) || - (generalSettings.ENABLE_AUTO_EXPRESSIONS != myCbEnableAutoExpressions.isSelected()) || (generalSettings.HIDE_NULL_ARRAY_ELEMENTS != myCbHideNullArrayElements.isSelected()) || myAutoTooltip.isChanged(); } @@ -308,7 +273,6 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { final ClassRenderer classRenderer = rendererSettings.getClassRenderer(); final boolean isClassRendererModified= - (classRenderer.SORT_ASCENDING != myCbSort.isSelected()) || (classRenderer.SHOW_STATIC != myCbShowStatic.isSelected()) || (classRenderer.SHOW_STATIC_FINAL != myCbShowStaticFinalFields.isSelectedWhenSelectable()) || (classRenderer.SHOW_SYNTHETICS != myCbShowSyntheticFields.isSelected()) || diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSettings.java b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSettings.java index a6aada62a61f..c682e3d5db87 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSettings.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSettings.java @@ -57,7 +57,6 @@ public class DebuggerSettings implements Cloneable, PersistentStateComponent { public boolean SHOW_OBJECTID = true; public boolean HIDE_NULL_ARRAY_ELEMENTS = true; public boolean AUTOSCROLL_TO_NEW_LOCALS = true; - public boolean ENABLE_AUTO_EXPRESSIONS = true; public ViewsGeneralSettings() { } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java b/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java index 630fa30339d2..32d024f07de1 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java @@ -42,12 +42,14 @@ import com.intellij.xdebugger.impl.breakpoints.ui.BreakpointPanelProvider; import com.intellij.xdebugger.impl.evaluate.quick.common.QuickEvaluateHandler; import com.intellij.xdebugger.impl.settings.DebuggerSettingsPanelProvider; import com.intellij.xdebugger.impl.ui.DebuggerUIUtil; +import com.intellij.xdebugger.settings.XDebuggerSettings; import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.*; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; /** * @author nik @@ -333,7 +335,7 @@ public class JavaDebuggerSupport extends DebuggerSupport { //} } - public static class JavaDebuggerSettingsPanelProvider extends DebuggerSettingsPanelProvider { + final static class JavaDebuggerSettingsPanelProvider extends DebuggerSettingsPanelProvider { @Override public int getPriority() { return 1; @@ -344,10 +346,10 @@ public class JavaDebuggerSupport extends DebuggerSupport { return new DebuggerLaunchingConfigurable(); } + @NotNull @Override public Collection getConfigurables() { final ArrayList configurables = new ArrayList(); - configurables.add(new DebuggerDataViewsConfigurable(null)); configurables.add(new DebuggerSteppingConfigurable()); configurables.add(new UserRenderersConfigurable(null)); configurables.add(new DebuggerHotswapConfigurable()); @@ -358,6 +360,25 @@ public class JavaDebuggerSupport extends DebuggerSupport { public void apply() { NodeRendererSettings.getInstance().fireRenderersChanged(); } + + @NotNull + @Override + public Collection getConfigurable(@NotNull XDebuggerSettings.Category category) { + switch (category) { + case DATA_VIEWS: + return Collections.singletonList(new DebuggerDataViewsConfigurable(null)); + } + return Collections.emptyList(); + } + + @Override + public void applied(@NotNull XDebuggerSettings.Category category) { + switch (category) { + case DATA_VIEWS: + NodeRendererSettings.getInstance().fireRenderersChanged(); + break; + } + } } public static Project getContextProjectForEditorFieldsInDebuggerConfigurables() { diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java index 09bf84e1a5bc..5d32e714ab89 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java @@ -53,6 +53,7 @@ import com.intellij.util.text.CharArrayUtil; import com.intellij.util.ui.tree.TreeModelAdapter; import com.intellij.xdebugger.XDebuggerBundle; import com.intellij.xdebugger.frame.XStackFrame; +import com.intellij.xdebugger.settings.XDebuggerSettingsManager; import com.sun.jdi.*; import gnu.trove.TIntObjectHashMap; import gnu.trove.TObjectProcedure; @@ -157,7 +158,7 @@ public class FrameVariablesTree extends DebuggerTree { } try { - if (!ViewsGeneralSettings.getInstance().ENABLE_AUTO_EXPRESSIONS && !myAutoWatchMode) { + if (!XDebuggerSettingsManager.getInstance().getDataViewSettings().isAutoExpressions() && !myAutoWatchMode) { // optimization super.buildVariables(stackDescriptor, evaluationContext); } @@ -569,7 +570,7 @@ public class FrameVariablesTree extends DebuggerTree { myVars = vars; myPosition = position; myEvalContext = evalContext; - myCollectExpressions = ViewsGeneralSettings.getInstance().ENABLE_AUTO_EXPRESSIONS; + myCollectExpressions = XDebuggerSettingsManager.getInstance().getDataViewSettings().isAutoExpressions(); } @Override diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/TipManager.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/TipManager.java index f063ac9382be..df91efed9579 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/TipManager.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/TipManager.java @@ -15,7 +15,6 @@ */ package com.intellij.debugger.ui.impl; -import com.intellij.debugger.settings.DebuggerSettings; import com.intellij.ide.FrameStateListener; import com.intellij.ide.FrameStateManager; import com.intellij.openapi.Disposable; @@ -32,6 +31,7 @@ import com.intellij.util.Alarm; import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.update.Activatable; import com.intellij.util.ui.update.UiNotifyConnector; +import com.intellij.xdebugger.settings.XDebuggerSettingsManager; import javax.swing.*; import javax.swing.event.PopupMenuEvent; @@ -183,7 +183,7 @@ public class TipManager implements Disposable, PopupMenuListener { showTooltip(e, auto); } } - }, auto ? DebuggerSettings.getInstance().VALUE_LOOKUP_DELAY : 10); + }, auto ? XDebuggerSettingsManager.getInstance().getDataViewSettings().getValueLookupDelay() : 10); } private void showTooltip(InputEvent e, boolean auto) { diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java index 52d557535917..d333eaaacd10 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java @@ -55,6 +55,7 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.SpeedSearchComparator; import com.intellij.ui.TreeSpeedSearch; +import com.intellij.xdebugger.settings.XDebuggerSettingsManager; import com.sun.jdi.*; import com.sun.jdi.event.Event; import com.sun.jdi.event.ExceptionEvent; @@ -485,7 +486,7 @@ public abstract class DebuggerTree extends DebuggerTreeBase implements DataProvi try { buildVariables(stackDescriptor, evaluationContext); - if (classRenderer.SORT_ASCENDING) { + if (XDebuggerSettingsManager.getInstance().getDataViewSettings().isSortValues()) { Collections.sort(myChildren, NodeManagerImpl.getNodeComparator()); } } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java index c1e98c428a57..7fe89bb42299 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java @@ -38,6 +38,7 @@ import com.intellij.psi.PsiElementFactory; import com.intellij.psi.PsiExpression; import com.intellij.util.IncorrectOperationException; import com.intellij.util.StringBuilderSpinAllocator; +import com.intellij.xdebugger.settings.XDebuggerSettingsManager; import com.sun.jdi.*; import org.jdom.Element; import org.jetbrains.annotations.NonNls; @@ -58,7 +59,6 @@ public class ClassRenderer extends NodeRendererImpl{ public static final @NonNls String UNIQUE_ID = "ClassRenderer"; - public boolean SORT_ASCENDING = false; public boolean SHOW_SYNTHETICS = true; public boolean SHOW_VAL_FIELDS_AS_LOCAL_VARIABLES = true; public boolean SHOW_STATIC = false; @@ -177,7 +177,7 @@ public class ClassRenderer extends NodeRendererImpl{ children.add(nodeManager.createNode(nodeDescriptorFactory.getFieldDescriptor(parentDescriptor, objRef, field), evaluationContext)); } - if(SORT_ASCENDING) { + if (XDebuggerSettingsManager.getInstance().getDataViewSettings().isSortValues()) { Collections.sort(children, NodeManagerImpl.getNodeComparator()); } } diff --git a/platform/platform-resources-en/src/messages/XDebuggerBundle.properties b/platform/platform-resources-en/src/messages/XDebuggerBundle.properties index 5a4e1802dc6a..7c0ea2b59628 100644 --- a/platform/platform-resources-en/src/messages/XDebuggerBundle.properties +++ b/platform/platform-resources-en/src/messages/XDebuggerBundle.properties @@ -1,6 +1,7 @@ xdebugger.colors.page.name=Debugger debugger.configurable.display.name=Debugger +debugger.dataViews.display.name=Data Views xdebugger.default.content.title=Debug xdebugger.debugger.tab.title=Debugger @@ -114,4 +115,5 @@ scope.library = Library scope.unknown = Unknown setting.value.tooltip.delay.label=&Value tooltip delay (ms): -setting.enable.auto.expressions.label=Enable auto expressions in Variables view \ No newline at end of file +setting.enable.auto.expressions.label=Enable auto expressions in Variables view +setting.sort.alphabetically.label=Sort a&lphabetically \ No newline at end of file diff --git a/platform/platform-resources/src/META-INF/xdebugger.xml b/platform/platform-resources/src/META-INF/xdebugger.xml index 6ec43c98f98a..68111b8eb7b2 100644 --- a/platform/platform-resources/src/META-INF/xdebugger.xml +++ b/platform/platform-resources/src/META-INF/xdebugger.xml @@ -15,7 +15,7 @@ - implements PersistentStateComponent { + public enum Category { + DATA_VIEWS + } + public static final ExtensionPointName EXTENSION_POINT = ExtensionPointName.create("com.intellij.xdebugger.settings"); private final String myId; @@ -50,4 +55,9 @@ public abstract class XDebuggerSettings implements PersistentStateComponent> T getDebuggerSettings(Class aClass) { - return XDebuggerSettingsManager.getInstance().getSettings(aClass); + return XDebuggerSettingsManager.getInstanceImpl().getSettings(aClass); } @Override diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/UnmuteOnStopAction.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/UnmuteOnStopAction.java index 79cef654c089..e9f36996dda7 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/UnmuteOnStopAction.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/UnmuteOnStopAction.java @@ -26,11 +26,11 @@ import com.intellij.xdebugger.impl.settings.XDebuggerSettingsManager; public class UnmuteOnStopAction extends ToggleAction implements DumbAware { @Override public boolean isSelected(AnActionEvent e) { - return XDebuggerSettingsManager.getInstance().getGeneralSettings().isUnmuteOnStop(); + return XDebuggerSettingsManager.getInstanceImpl().getGeneralSettings().isUnmuteOnStop(); } @Override public void setSelected(AnActionEvent e, boolean state) { - XDebuggerSettingsManager.getInstance().getGeneralSettings().setUnmuteOnStop(state); + XDebuggerSettingsManager.getInstanceImpl().getGeneralSettings().setUnmuteOnStop(state); } } \ No newline at end of file diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/XDebuggerEvaluationDialog.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/XDebuggerEvaluationDialog.java index 4dedaae5ae8e..2273ab698768 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/XDebuggerEvaluationDialog.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/XDebuggerEvaluationDialog.java @@ -111,7 +111,7 @@ public class XDebuggerEvaluationDialog extends DialogWrapper { } }); - EvaluationMode mode = XDebuggerSettingsManager.getInstance().getGeneralSettings().getEvaluationDialogMode(); + EvaluationMode mode = XDebuggerSettingsManager.getInstanceImpl().getGeneralSettings().getEvaluationDialogMode(); myIsCodeFragmentEvaluationSupported = evaluator.isCodeFragmentEvaluationSupported(); if (mode == EvaluationMode.CODE_FRAGMENT && !myIsCodeFragmentEvaluationSupported) { mode = EvaluationMode.EXPRESSION; @@ -185,7 +185,7 @@ public class XDebuggerEvaluationDialog extends DialogWrapper { private void switchToMode(EvaluationMode mode, XExpression text) { if (myMode == mode) return; - XDebuggerSettingsManager.getInstance().getGeneralSettings().setEvaluationDialogMode(mode); + XDebuggerSettingsManager.getInstanceImpl().getGeneralSettings().setEvaluationDialogMode(mode); myMode = mode; diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/XQuickEvaluateHandler.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/XQuickEvaluateHandler.java index 1669e102f15f..bf3e0010e6cf 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/XQuickEvaluateHandler.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/XQuickEvaluateHandler.java @@ -29,6 +29,7 @@ import com.intellij.xdebugger.evaluation.XDebuggerEvaluator; import com.intellij.xdebugger.impl.evaluate.quick.common.AbstractValueHint; import com.intellij.xdebugger.impl.evaluate.quick.common.QuickEvaluateHandler; import com.intellij.xdebugger.impl.evaluate.quick.common.ValueHintType; +import com.intellij.xdebugger.settings.XDebuggerSettingsManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -107,6 +108,6 @@ public class XQuickEvaluateHandler extends QuickEvaluateHandler { return evaluator.getValuePopupDelay(); } } - return 700; + return XDebuggerSettingsManager.getInstance().getDataViewSettings().getValueLookupDelay(); } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurable.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurable.java new file mode 100644 index 000000000000..a064752a5330 --- /dev/null +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurable.java @@ -0,0 +1,99 @@ +package com.intellij.xdebugger.impl.settings; + +import com.intellij.openapi.options.Configurable; +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.options.SearchableConfigurable; +import com.intellij.xdebugger.XDebuggerBundle; +import com.intellij.xdebugger.impl.DebuggerSupport; +import com.intellij.xdebugger.settings.XDebuggerSettings; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.util.List; + +public class DataViewsConfigurable implements SearchableConfigurable.Parent { + private DataViewsConfigurableUi root; + private Configurable[] children; + + @Override + public boolean hasOwnContent() { + return true; + } + + @Override + public boolean isVisible() { + return true; + } + + @Override + public Configurable[] getConfigurables() { + if (children == null) { + List configurables = DebuggerConfigurableProvider.getConfigurables(XDebuggerSettings.Category.DATA_VIEWS); + children = configurables.toArray(new Configurable[configurables.size()]); + } + return children; + } + + @NotNull + @Override + public String getId() { + return "debugger.dataViews"; + } + + @Nullable + @Override + public Runnable enableSearch(String option) { + return null; + } + + @Nls + @Override + public String getDisplayName() { + return XDebuggerBundle.message("debugger.dataViews.display.name"); + } + + @Nullable + @Override + public String getHelpTopic() { + return null; + } + + @Nullable + @Override + public JComponent createComponent() { + if (root == null) { + root = new DataViewsConfigurableUi(); + } + return root.getComponent(); + } + + @Override + public boolean isModified() { + return root != null && root.isModified(XDebuggerSettingsManager.getInstanceImpl().getDataViewSettings()); + } + + @Override + public void apply() throws ConfigurationException { + if (root != null) { + root.apply(XDebuggerSettingsManager.getInstanceImpl().getDataViewSettings()); + for (DebuggerSupport support : DebuggerSupport.getDebuggerSupports()) { + support.getSettingsPanelProvider().applied(XDebuggerSettings.Category.DATA_VIEWS); + } + } + } + + @Override + public void reset() { + if (root != null) { + root.reset(XDebuggerSettingsManager.getInstanceImpl().getDataViewSettings()); + } + } + + @Override + public void disposeUIResources() { + root = null; + children = null; + } +} \ No newline at end of file diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurableUi.form b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurableUi.form new file mode 100644 index 000000000000..a6e3f94f3bec --- /dev/null +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurableUi.form @@ -0,0 +1,50 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurableUi.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurableUi.java new file mode 100644 index 000000000000..1a92912c3022 --- /dev/null +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurableUi.java @@ -0,0 +1,46 @@ +package com.intellij.xdebugger.impl.settings; + +import com.intellij.openapi.util.text.StringUtilRt; +import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; + +public class DataViewsConfigurableUi { + private JCheckBox enableAutoExpressionsCheckBox; + private JFormattedTextField valueTooltipDelayTextField; + private JPanel panel; + private JCheckBox sortAlphabeticallyCheckBox; + + public DataViewsConfigurableUi() { + UIUtil.configureNumericFormattedTextField(valueTooltipDelayTextField); + } + + private int getValueTooltipDelay() { + Object value = valueTooltipDelayTextField.getValue(); + return value instanceof Number ? ((Number)value).intValue() : StringUtilRt.parseInt((String)value, XDebuggerDataViewSettings.DEFAULT_VALUE_TOOLTIP_DELAY); + } + + @NotNull + public JComponent getComponent() { + return panel; + } + + public boolean isModified(@NotNull XDebuggerDataViewSettings settings) { + return getValueTooltipDelay() != settings.getValueLookupDelay() || + sortAlphabeticallyCheckBox.isSelected() != settings.isSortValues() || + enableAutoExpressionsCheckBox.isSelected() != settings.isAutoExpressions(); + } + + public void reset(@NotNull XDebuggerDataViewSettings settings) { + valueTooltipDelayTextField.setValue(settings.getValueLookupDelay()); + sortAlphabeticallyCheckBox.setSelected(settings.isSortValues()); + enableAutoExpressionsCheckBox.setSelected(settings.isAutoExpressions()); + } + + public void apply(@NotNull XDebuggerDataViewSettings settings) { + settings.setValueLookupDelay(getValueTooltipDelay()); + settings.setSortValues(sortAlphabeticallyCheckBox.isSelected()); + settings.setAutoExpressions(enableAutoExpressionsCheckBox.isSelected()); + } +} \ No newline at end of file diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java index 12f44d0fe4cc..10ac0496e053 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java @@ -19,7 +19,10 @@ import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurableProvider; import com.intellij.util.PlatformUtils; import com.intellij.util.SmartList; +import com.intellij.util.containers.ContainerUtil; import com.intellij.xdebugger.impl.DebuggerSupport; +import com.intellij.xdebugger.settings.XDebuggerSettings; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Collections; @@ -30,20 +33,38 @@ import java.util.List; * @author nik */ public class DebuggerConfigurableProvider extends ConfigurableProvider { - @Override - public Configurable createConfigurable() { - List providers = new SmartList(); + @NotNull + private static List getSortedProviders() { + List providers = null; for (DebuggerSupport support : DebuggerSupport.getDebuggerSupports()) { - providers.add(support.getSettingsPanelProvider()); + DebuggerSettingsPanelProvider provider = support.getSettingsPanelProvider(); + if (providers == null) { + providers = new SmartList(); + } + providers.add(provider); } + if (ContainerUtil.isEmpty(providers)) { + return Collections.emptyList(); + } + + if (providers.size() > 1) { + Collections.sort(providers, new Comparator() { + @Override + public int compare(DebuggerSettingsPanelProvider o1, DebuggerSettingsPanelProvider o2) { + return o2.getPriority() - o1.getPriority(); + } + }); + } + return providers; + } + + @Override + public Configurable createConfigurable() { + List providers = getSortedProviders(); + List configurables = new ArrayList(); - Collections.sort(providers, new Comparator() { - @Override - public int compare(final DebuggerSettingsPanelProvider o1, final DebuggerSettingsPanelProvider o2) { - return o2.getPriority() - o1.getPriority(); - } - }); + configurables.add(new DataViewsConfigurable()); Configurable rootConfigurable = null; for (DebuggerSettingsPanelProvider provider : providers) { @@ -72,4 +93,18 @@ public class DebuggerConfigurableProvider extends ConfigurableProvider { return new DebuggerConfigurable(rootConfigurable, configurables); } + + @NotNull + static List getConfigurables(@NotNull XDebuggerSettings.Category category) { + List providers = getSortedProviders(); + if (providers.isEmpty()) { + return Collections.emptyList(); + } + + List configurables = new SmartList(); + for (DebuggerSettingsPanelProvider provider : providers) { + configurables.addAll(provider.getConfigurable(category)); + } + return configurables.isEmpty() ? Collections.emptyList() : configurables; + } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerSettingsPanelProvider.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerSettingsPanelProvider.java index ba0bb43621e9..5dc9db98de3f 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerSettingsPanelProvider.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerSettingsPanelProvider.java @@ -16,18 +16,25 @@ package com.intellij.xdebugger.impl.settings; import com.intellij.openapi.options.Configurable; +import com.intellij.xdebugger.settings.XDebuggerSettings; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collection; +import java.util.Collections; /** * @author nik */ public abstract class DebuggerSettingsPanelProvider { + public int getPriority() { + return 0; + } - public abstract int getPriority(); - - public abstract Collection getConfigurables(); + @NotNull + public Collection getConfigurables() { + return Collections.emptyList(); + } public void apply() { } @@ -36,4 +43,15 @@ public abstract class DebuggerSettingsPanelProvider { public Configurable getRootConfigurable() { return null; } + + @NotNull + public Collection getConfigurable(@NotNull XDebuggerSettings.Category category) { + return Collections.emptyList(); + } + + /** + * General settings of category were applied + */ + public void applied(@NotNull XDebuggerSettings.Category category) { + } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/XDebuggerDataViewSettings.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/XDebuggerDataViewSettings.java index bff7c531119d..3dd802430ecf 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/XDebuggerDataViewSettings.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/XDebuggerDataViewSettings.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -16,15 +16,21 @@ package com.intellij.xdebugger.impl.settings; import com.intellij.util.xmlb.annotations.Tag; -import com.intellij.xdebugger.evaluation.EvaluationMode; +import com.intellij.xdebugger.settings.XDebuggerSettingsManager; /** * @author nik */ @Tag("data-views") -public class XDebuggerDataViewSettings { +public class XDebuggerDataViewSettings implements XDebuggerSettingsManager.DataViewSettings { + static final int DEFAULT_VALUE_TOOLTIP_DELAY = 700; + private boolean mySortValues; + private boolean autoExpressions = true; + private int valueLookupDelay = DEFAULT_VALUE_TOOLTIP_DELAY; + + @Override @Tag("sort-values") public boolean isSortValues() { return mySortValues; @@ -33,4 +39,22 @@ public class XDebuggerDataViewSettings { public void setSortValues(boolean sortValues) { mySortValues = sortValues; } + + @Override + public int getValueLookupDelay() { + return valueLookupDelay; + } + + public void setValueLookupDelay(int value) { + valueLookupDelay = value; + } + + @Override + public boolean isAutoExpressions() { + return autoExpressions; + } + + public void setAutoExpressions(boolean autoExpressions) { + this.autoExpressions = autoExpressions; + } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/XDebuggerSettingsManager.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/XDebuggerSettingsManager.java index ae2dcbc4cca1..8842639fce75 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/XDebuggerSettingsManager.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/XDebuggerSettingsManager.java @@ -26,12 +26,15 @@ import com.intellij.util.xmlb.annotations.Tag; import com.intellij.xdebugger.settings.XDebuggerSettings; import org.jdom.Element; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; import java.util.*; /** * @author nik + * todo rename to XDebuggerSettingsManagerImpl */ +@SuppressWarnings("ClassNameSameAsAncestorName") @State( name = XDebuggerSettingsManager.COMPONENT_NAME, storages = { @@ -40,17 +43,18 @@ import java.util.*; ) } ) -public class XDebuggerSettingsManager implements PersistentStateComponent{ +public class XDebuggerSettingsManager extends com.intellij.xdebugger.settings.XDebuggerSettingsManager implements PersistentStateComponent{ @NonNls public static final String COMPONENT_NAME = "XDebuggerSettings"; private Map> mySettingsById; private Map, XDebuggerSettings> mySettingsByClass; private XDebuggerDataViewSettings myDataViewSettings = new XDebuggerDataViewSettings(); private XDebuggerGeneralSettings myGeneralSettings = new XDebuggerGeneralSettings(); - public static XDebuggerSettingsManager getInstance() { - return ServiceManager.getService(XDebuggerSettingsManager.class); + public static XDebuggerSettingsManager getInstanceImpl() { + return (XDebuggerSettingsManager)com.intellij.xdebugger.settings.XDebuggerSettingsManager.getInstance(); } + @Override public SettingsState getState() { SettingsState settingsState = new SettingsState(); settingsState.setDataViewSettings(myDataViewSettings); @@ -69,6 +73,8 @@ public class XDebuggerSettingsManager implements PersistentStateComponent getConfigurables() { - ArrayList list = new ArrayList(); - for (XDebuggerSettings settings : XDebuggerSettingsManager.getInstance().getSettingsList()) { + List list = new SmartList(); + for (XDebuggerSettings settings : XDebuggerSettingsManager.getInstanceImpl().getSettingsList()) { list.add(settings.createConfigurable()); } return list; } + @NotNull + @Override + public Collection getConfigurable(@NotNull XDebuggerSettings.Category category) { + List list = null; + for (XDebuggerSettings settings : XDebuggerSettingsManager.getInstanceImpl().getSettingsList()) { + Configurable configurable = settings.createConfigurable(category); + if (configurable != null) { + if (list == null) { + list = new SmartList(); + } + list.add(configurable); + } + } + return ContainerUtil.isEmpty(list) ? Collections.emptyList() : list; + } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/actions/SortValuesToggleAction.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/actions/SortValuesToggleAction.java index 00d803d68244..e399dbd96eba 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/actions/SortValuesToggleAction.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/actions/SortValuesToggleAction.java @@ -27,12 +27,12 @@ import com.intellij.xdebugger.impl.settings.XDebuggerSettingsManager; public class SortValuesToggleAction extends ToggleAction implements DumbAware { @Override public boolean isSelected(AnActionEvent e) { - return XDebuggerSettingsManager.getInstance().getDataViewSettings().isSortValues(); + return XDebuggerSettingsManager.getInstanceImpl().getDataViewSettings().isSortValues(); } @Override public void setSelected(AnActionEvent e, boolean state) { - XDebuggerSettingsManager.getInstance().getDataViewSettings().setSortValues(state); + XDebuggerSettingsManager.getInstanceImpl().getDataViewSettings().setSortValues(state); XDebuggerUtilImpl.rebuildAllSessionsViews(e.getProject()); } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XValueContainerNode.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XValueContainerNode.java index 38d2547831fe..b9f90fe86b2b 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XValueContainerNode.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XValueContainerNode.java @@ -21,9 +21,9 @@ import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.SortedList; import com.intellij.xdebugger.frame.*; -import com.intellij.xdebugger.impl.settings.XDebuggerSettingsManager; import com.intellij.xdebugger.impl.ui.XDebuggerUIConstants; import com.intellij.xdebugger.impl.ui.tree.XDebuggerTree; +import com.intellij.xdebugger.settings.XDebuggerSettingsManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XDebuggerSettingsTest.java b/platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XDebuggerSettingsTest.java index ff4b0d2f1a89..a4b7431d276f 100644 --- a/platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XDebuggerSettingsTest.java +++ b/platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XDebuggerSettingsTest.java @@ -36,11 +36,11 @@ public class XDebuggerSettingsTest extends PlatformLiteFixture { registerExtensionPoint(XDebuggerSettings.EXTENSION_POINT, XDebuggerSettings.class); registerExtension(XDebuggerSettings.EXTENSION_POINT, new MyDebuggerSettings()); getApplication().registerService(XDebuggerUtil.class, XDebuggerUtilImpl.class); - getApplication().registerService(XDebuggerSettingsManager.class, XDebuggerSettingsManager.class); + getApplication().registerService(com.intellij.xdebugger.settings.XDebuggerSettingsManager.class, XDebuggerSettingsManager.class); } public void testSerialize() throws Exception { - XDebuggerSettingsManager settingsManager = XDebuggerSettingsManager.getInstance(); + XDebuggerSettingsManager settingsManager = XDebuggerSettingsManager.getInstanceImpl(); MyDebuggerSettings settings = MyDebuggerSettings.getInstance(); assertNotNull(settings); diff --git a/resources-en/src/messages/DebuggerBundle.properties b/resources-en/src/messages/DebuggerBundle.properties index f59b89d160c4..26d078746bef 100644 --- a/resources-en/src/messages/DebuggerBundle.properties +++ b/resources-en/src/messages/DebuggerBundle.properties @@ -173,7 +173,6 @@ label.array.renderer.configurable.start.index=Array sta&rt index: label.array.renderer.configurable.end.index=en&d index: label.array.renderer.configurable.max.count1=Show &maximum label.array.renderer.configurable.max.count2=array elements -base.renderer.configurable.display.name=Data Views label.base.renderer.configurable.autoscroll=Autoscroll to new &local variables label.base.renderer.configurable.show.synthetic.fields=S&ynthetic fields label.base.renderer.configurable.show.val.fields.as.locals=$val fields as local &variables From 4a15d1bde8f5e07bb96b167f033a5e803b30999f Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 21 Jul 2014 14:52:15 +0200 Subject: [PATCH 29/69] add copyright --- .../settings/XDebuggerSettingsManager.java | 15 +++++++++++++++ .../impl/settings/DataViewsConfigurable.java | 15 +++++++++++++++ .../impl/settings/DataViewsConfigurableUi.java | 15 +++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/platform/xdebugger-api/src/com/intellij/xdebugger/settings/XDebuggerSettingsManager.java b/platform/xdebugger-api/src/com/intellij/xdebugger/settings/XDebuggerSettingsManager.java index 0c1b2b860a1e..2fa473d93935 100644 --- a/platform/xdebugger-api/src/com/intellij/xdebugger/settings/XDebuggerSettingsManager.java +++ b/platform/xdebugger-api/src/com/intellij/xdebugger/settings/XDebuggerSettingsManager.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2014 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.xdebugger.settings; import com.intellij.openapi.components.ServiceManager; diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurable.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurable.java index a064752a5330..29d718d98c22 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurable.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurable.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2014 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.xdebugger.impl.settings; import com.intellij.openapi.options.Configurable; diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurableUi.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurableUi.java index 1a92912c3022..76645db3a3d3 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurableUi.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurableUi.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2014 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.xdebugger.impl.settings; import com.intellij.openapi.util.text.StringUtilRt; From 5c8114656c108906c43bda68172f9d4e1951174e Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 21 Jul 2014 16:09:43 +0200 Subject: [PATCH 30/69] =?UTF-8?q?generic=20debugger=20settings:=20step=201?= =?UTF-8?q?=20=E2=80=94=20data=20views=20=E2=80=94=20merge=20settings=20(g?= =?UTF-8?q?eneric=20and=20custom)=20into=20one=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit So, AppCode supported and no regression. --- .../xdebugger/settings/XDebuggerSettings.java | 2 +- .../impl/settings/DataViewsConfigurable.java | 53 +++++++++++++--- .../impl/settings/DebuggerConfigurable.java | 62 ++++++++++++++++--- .../DebuggerConfigurableProvider.java | 36 +---------- .../XDebuggerSettingsPanelProviderImpl.java | 2 +- 5 files changed, 103 insertions(+), 52 deletions(-) diff --git a/platform/xdebugger-api/src/com/intellij/xdebugger/settings/XDebuggerSettings.java b/platform/xdebugger-api/src/com/intellij/xdebugger/settings/XDebuggerSettings.java index 147af6245a7e..1c0afe84d41c 100644 --- a/platform/xdebugger-api/src/com/intellij/xdebugger/settings/XDebuggerSettings.java +++ b/platform/xdebugger-api/src/com/intellij/xdebugger/settings/XDebuggerSettings.java @@ -53,7 +53,7 @@ public abstract class XDebuggerSettings implements PersistentStateComponent configurables = DebuggerConfigurableProvider.getConfigurables(XDebuggerSettings.Category.DATA_VIEWS); children = configurables.toArray(new Configurable[configurables.size()]); } - return children; + return children.length == 1 ? DebuggerConfigurable.EMPTY_CONFIGURABLES : children; } @NotNull @@ -72,21 +76,44 @@ public class DataViewsConfigurable implements SearchableConfigurable.Parent { @Nullable @Override public String getHelpTopic() { - return null; + getConfigurables(); + return children.length == 1 ? children[0].getHelpTopic() : null; } @Nullable @Override public JComponent createComponent() { - if (root == null) { - root = new DataViewsConfigurableUi(); + if (component == null) { + if (root == null) { + root = new DataViewsConfigurableUi(); + } + + getConfigurables(); + if (children.length == 1) { + JPanel panel = new JPanel(new BorderLayout(0, IdeBorderFactory.TITLED_BORDER_BOTTOM_INSET)); + panel.add(root.getComponent(), BorderLayout.NORTH); + Configurable configurable = children[0]; + JComponent configurableComponent = configurable.createComponent(); + assert configurableComponent != null; + configurableComponent.setBorder(IdeBorderFactory.createTitledBorder(configurable.getDisplayName(), false)); + panel.add(configurableComponent, BorderLayout.CENTER); + component = panel; + } + else { + component = root.getComponent(); + } } - return root.getComponent(); + return component; } @Override public boolean isModified() { - return root != null && root.isModified(XDebuggerSettingsManager.getInstanceImpl().getDataViewSettings()); + if (root != null && root.isModified(XDebuggerSettingsManager.getInstanceImpl().getDataViewSettings())) { + return true; + } + else { + return children.length == 1 && children[0].isModified(); + } } @Override @@ -97,6 +124,10 @@ public class DataViewsConfigurable implements SearchableConfigurable.Parent { support.getSettingsPanelProvider().applied(XDebuggerSettings.Category.DATA_VIEWS); } } + + if (children.length == 1) { + children[0].apply(); + } } @Override @@ -104,11 +135,19 @@ public class DataViewsConfigurable implements SearchableConfigurable.Parent { if (root != null) { root.reset(XDebuggerSettingsManager.getInstanceImpl().getDataViewSettings()); } + if (children.length == 1) { + children[0].reset(); + } } @Override public void disposeUIResources() { root = null; + component = null; + + if (children.length == 1) { + children[0].disposeUIResources(); + } children = null; } } \ No newline at end of file diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java index b72115df0a5e..bff0d2236f7f 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -22,9 +22,9 @@ import com.intellij.xdebugger.XDebuggerBundle; import com.intellij.xdebugger.impl.DebuggerSupport; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import javax.swing.*; +import java.util.ArrayList; import java.util.List; /** @@ -32,13 +32,11 @@ import java.util.List; */ public class DebuggerConfigurable implements SearchableConfigurable.Parent { public static final String DISPLAY_NAME = XDebuggerBundle.message("debugger.configurable.display.name"); - private final Configurable myRootConfigurable; - private final Configurable[] myChildren; - public DebuggerConfigurable(@Nullable Configurable rootConfigurable, @NotNull List children) { - myRootConfigurable = rootConfigurable; - myChildren = children.toArray(new Configurable[children.size()]); - } + static final Configurable[] EMPTY_CONFIGURABLES = new Configurable[0]; + + private Configurable myRootConfigurable; + private Configurable[] myChildren; @Override public String getDisplayName() { @@ -52,7 +50,51 @@ public class DebuggerConfigurable implements SearchableConfigurable.Parent { @Override public Configurable[] getConfigurables() { - return myChildren; + compute(); + + if (myChildren.length == 0 && myRootConfigurable instanceof SearchableConfigurable.Parent) { + return ((Parent)myRootConfigurable).getConfigurables(); + } + else { + return myChildren; + } + } + + private void compute() { + if (myChildren != null) { + return; + } + + List providers = DebuggerConfigurableProvider.getSortedProviders(); + + List configurables = new ArrayList(); + configurables.add(new DataViewsConfigurable()); + + Configurable rootConfigurable = null; + for (DebuggerSettingsPanelProvider provider : providers) { + configurables.addAll(provider.getConfigurables()); + Configurable aRootConfigurable = provider.getRootConfigurable(); + if (aRootConfigurable != null) { + if (rootConfigurable != null) { + configurables.add(aRootConfigurable); + } + else { + rootConfigurable = aRootConfigurable; + } + } + } + + if (configurables.isEmpty() && rootConfigurable == null) { + myChildren = EMPTY_CONFIGURABLES; + } + else if (rootConfigurable == null && configurables.size() == 1) { + myRootConfigurable = configurables.get(0); + myChildren = EMPTY_CONFIGURABLES; + } + else { + myChildren = configurables.toArray(new Configurable[configurables.size()]); + myRootConfigurable = rootConfigurable; + } } @Override @@ -67,6 +109,7 @@ public class DebuggerConfigurable implements SearchableConfigurable.Parent { @Override public boolean hasOwnContent() { + compute(); return myRootConfigurable != null; } @@ -82,6 +125,7 @@ public class DebuggerConfigurable implements SearchableConfigurable.Parent { @Override public JComponent createComponent() { + compute(); return myRootConfigurable != null ? myRootConfigurable.createComponent() : null; } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java index 10ac0496e053..3983e7677e78 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java @@ -17,14 +17,12 @@ package com.intellij.xdebugger.impl.settings; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurableProvider; -import com.intellij.util.PlatformUtils; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; import com.intellij.xdebugger.impl.DebuggerSupport; import com.intellij.xdebugger.settings.XDebuggerSettings; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -34,7 +32,7 @@ import java.util.List; */ public class DebuggerConfigurableProvider extends ConfigurableProvider { @NotNull - private static List getSortedProviders() { + static List getSortedProviders() { List providers = null; for (DebuggerSupport support : DebuggerSupport.getDebuggerSupports()) { DebuggerSettingsPanelProvider provider = support.getSettingsPanelProvider(); @@ -61,37 +59,7 @@ public class DebuggerConfigurableProvider extends ConfigurableProvider { @Override public Configurable createConfigurable() { - List providers = getSortedProviders(); - - List configurables = new ArrayList(); - configurables.add(new DataViewsConfigurable()); - - Configurable rootConfigurable = null; - for (DebuggerSettingsPanelProvider provider : providers) { - configurables.addAll(provider.getConfigurables()); - final Configurable aRootConfigurable = provider.getRootConfigurable(); - if (aRootConfigurable != null) { - if (rootConfigurable != null) { - configurables.add(aRootConfigurable); - } - else { - rootConfigurable = aRootConfigurable; - } - } - } - if (configurables.isEmpty() && rootConfigurable == null) { - return null; - } - - //Perhaps we always should have a root node 'Debugger' with separate nodes for language-specific settings under it. - //However for AppCode there is only one language which is clearly associated with the product - //This code should removed when we extract the common debugger settings to the root node. - if (PlatformUtils.isCidr() && rootConfigurable == null && configurables.size() == 1) { - rootConfigurable = configurables.get(0); - configurables = Collections.emptyList(); - } - - return new DebuggerConfigurable(rootConfigurable, configurables); + return new DebuggerConfigurable(); } @NotNull diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/XDebuggerSettingsPanelProviderImpl.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/XDebuggerSettingsPanelProviderImpl.java index 22827d59a464..26be4d32d44d 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/XDebuggerSettingsPanelProviderImpl.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/XDebuggerSettingsPanelProviderImpl.java @@ -34,7 +34,7 @@ public class XDebuggerSettingsPanelProviderImpl extends DebuggerSettingsPanelPro public Collection getConfigurables() { List list = new SmartList(); for (XDebuggerSettings settings : XDebuggerSettingsManager.getInstanceImpl().getSettingsList()) { - list.add(settings.createConfigurable()); + ContainerUtil.addIfNotNull(list, settings.createConfigurable()); } return list; } From f18c04dcb53c291bf34aea75df88e298381155dd Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 21 Jul 2014 18:41:22 +0400 Subject: [PATCH 31/69] jps plugins: added extension to allow plugins contribute to JPS model even if they don't contribute to external build --- .../jps/impl/JpsIdePluginManagerImpl.java | 16 +++++++++--- .../com/intellij/jps/impl/JpsPluginBean.java | 26 +++++++++++++++++++ .../src/META-INF/PlatformExtensionPoints.xml | 3 +++ 3 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 platform/platform-impl/src/com/intellij/jps/impl/JpsPluginBean.java diff --git a/platform/platform-impl/src/com/intellij/jps/impl/JpsIdePluginManagerImpl.java b/platform/platform-impl/src/com/intellij/jps/impl/JpsIdePluginManagerImpl.java index 72e7b8a4973e..2d51053846fa 100644 --- a/platform/platform-impl/src/com/intellij/jps/impl/JpsIdePluginManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/jps/impl/JpsIdePluginManagerImpl.java @@ -37,15 +37,23 @@ public class JpsIdePluginManagerImpl extends JpsPluginManager { public JpsIdePluginManagerImpl() { ExtensionsArea rootArea = Extensions.getRootArea(); - //todo[nik] introduce more generic platform extension for JPS plugins instead + rootArea.getExtensionPoint(JpsPluginBean.EP_NAME).addExtensionPointListener(new ExtensionPointListener() { + @Override + public void extensionAdded(@NotNull JpsPluginBean extension, @Nullable PluginDescriptor pluginDescriptor) { + ContainerUtil.addIfNotNull(pluginDescriptor, myExternalBuildPlugins); + } + + @Override + public void extensionRemoved(@NotNull JpsPluginBean extension, @Nullable PluginDescriptor pluginDescriptor) { + } + }); if (rootArea.hasExtensionPoint("com.intellij.compileServer.plugin")) { ExtensionPoint extensionPoint = rootArea.getExtensionPoint("com.intellij.compileServer.plugin"); + //noinspection unchecked extensionPoint.addExtensionPointListener(new ExtensionPointListener() { @Override public void extensionAdded(@NotNull Object extension, @Nullable PluginDescriptor pluginDescriptor) { - if (pluginDescriptor != null) { - myExternalBuildPlugins.add(pluginDescriptor); - } + ContainerUtil.addIfNotNull(pluginDescriptor, myExternalBuildPlugins); } @Override diff --git a/platform/platform-impl/src/com/intellij/jps/impl/JpsPluginBean.java b/platform/platform-impl/src/com/intellij/jps/impl/JpsPluginBean.java new file mode 100644 index 000000000000..4979dd78cfe6 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/jps/impl/JpsPluginBean.java @@ -0,0 +1,26 @@ +/* + * Copyright 2000-2014 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.jps.impl; + +import com.intellij.openapi.extensions.AbstractExtensionPointBean; +import com.intellij.openapi.extensions.ExtensionPointName; + +/** + * @author nik + */ +public class JpsPluginBean extends AbstractExtensionPointBean { + public static final ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.jps.plugin"); +} diff --git a/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml b/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml index 61ee24ebe543..e8a45edbf138 100644 --- a/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml +++ b/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml @@ -12,6 +12,9 @@ + + From 04d10f8af753dcbb7639492c3bbec858dc1fbf2a Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Mon, 21 Jul 2014 19:20:00 +0400 Subject: [PATCH 32/69] IDEA-127337 Popups in editor sometimes aren't shown on first invocation --- .../com/intellij/ui/popup/AbstractPopup.java | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java b/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java index 6bfc56df4399..f25093c6dd8d 100644 --- a/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java +++ b/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java @@ -763,7 +763,27 @@ public class AbstractPopup implements JBPopup { RootPaneContainer root = (RootPaneContainer)popupOwner; popupOwner = root.getRootPane(); } + if (LOG.isDebugEnabled()) { + LOG.debug("expected preferred size: " + myContent.getPreferredSize()); + } myPopup = factory.getPopup(popupOwner, myContent, targetBounds.x, targetBounds.y, this); + if (LOG.isDebugEnabled()) { + LOG.debug(" actual preferred size: " + myContent.getPreferredSize()); + } + if ((targetBounds.width != myContent.getWidth()) || (targetBounds.height != myContent.getHeight())) { + // JDK uses cached heavyweight popup that is not initialized properly + LOG.debug("the expected size is not equal to the actual size"); + Window popup = myPopup.getWindow(); + if (popup != null) { + popup.setSize(targetBounds.width, targetBounds.height); + if (myContent.getParent().getComponentCount() != 1) { + LOG.debug("unexpected count of components in heavy-weight popup"); + } + } + else { + LOG.debug("cannot fix size for non-heavy-weight popup"); + } + } if (myResizable) { final JRootPane root = myContent.getRootPane(); @@ -805,11 +825,7 @@ public class AbstractPopup implements JBPopup { listener.beforeShown(new LightweightWindowEvent(this)); } - // can be improved by moving in myPopup code - myPopup.getWindow().pack(); - myPopup.setRequestFocus(myRequestFocus); - LOG.debug("popup window size: " + myPopup.getWindow().getSize()); myPopup.show(); final Window window = SwingUtilities.getWindowAncestor(myContent); From 1017a7748fa10dbcb9a595a135eaaa99fa9dff42 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 21 Jul 2014 12:15:14 +0200 Subject: [PATCH 33/69] SSR: remove a bit of dead code --- .../JavaStructuralSearchProfile.java | 14 -------------- .../plugin/replace/impl/ParameterInfo.java | 9 --------- .../plugin/replace/impl/ReplacementBuilder.java | 1 - 3 files changed, 24 deletions(-) diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaStructuralSearchProfile.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaStructuralSearchProfile.java index c738b55b85ae..848228121d81 100644 --- a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaStructuralSearchProfile.java +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaStructuralSearchProfile.java @@ -431,20 +431,6 @@ public class JavaStructuralSearchProfile extends StructuralSearchProfile { } } - @Override - public void visitMethod(PsiMethod method) { - super.visitMethod(method); - - String name = method.getName(); - if (StructuralSearchUtil.isTypedVariable(name)) { - name = Replacer.stripTypedVariableDecoration(name); - - ParameterInfo methodInfo = builder.findParameterization(name); - methodInfo.setScopeParameterization(true); - //if (scopedParameterizations != null) scopedParameterizations.put(method.getTextRange(), methodInfo); - } - } - @Override public void visitParameter(PsiParameter parameter) { super.visitParameter(parameter); diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ParameterInfo.java b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ParameterInfo.java index 43ce859b17dd..58f49f8bbd8c 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ParameterInfo.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ParameterInfo.java @@ -13,7 +13,6 @@ public final class ParameterInfo { private boolean hasCommaBefore; private int beforeDelimiterPos; private boolean hasCommaAfter; - private boolean scopeParameterization; private boolean replacementVariable; private PsiElement myElement; @@ -97,14 +96,6 @@ public final class ParameterInfo { this.hasCommaAfter = hasCommaAfter; } - public boolean isScopeParameterization() { - return scopeParameterization; - } - - public void setScopeParameterization(boolean scopeParameterization) { - this.scopeParameterization = scopeParameterization; - } - public boolean isReplacementVariable() { return replacementVariable; } diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ReplacementBuilder.java b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ReplacementBuilder.java index 81933d9c9a91..d822b1f52072 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ReplacementBuilder.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ReplacementBuilder.java @@ -30,7 +30,6 @@ public final class ReplacementBuilder { private HashMap matchMap; private final Map replacementVarsMap; private final ReplaceOptions options; - //private Map scopedParameterizations; ReplacementBuilder(final Project project,final ReplaceOptions options) { replacementVarsMap = new HashMap(); From 912772c9b0ccc112ac01866bf9dee12a17cf7b0b Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 21 Jul 2014 12:17:17 +0200 Subject: [PATCH 34/69] SSR: remove unnecessary field --- .../plugin/replace/impl/ReplacementBuilder.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ReplacementBuilder.java b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ReplacementBuilder.java index d822b1f52072..2ed02bbe48d8 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ReplacementBuilder.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ReplacementBuilder.java @@ -27,7 +27,6 @@ import java.util.*; public final class ReplacementBuilder { private String replacement; private List parameterizations; - private HashMap matchMap; private final Map replacementVarsMap; private final ReplaceOptions options; @@ -135,7 +134,7 @@ public final class ReplacementBuilder { } final StringBuilder result = new StringBuilder(replacement); - matchMap = new HashMap(); + HashMap matchMap = new HashMap(); fill(match, matchMap); int offset = 0; From 6af6e5de35700a6a9fe51c02e7cdf9a2fad02b9a Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 21 Jul 2014 12:19:00 +0200 Subject: [PATCH 35/69] SSR: Nullable annotations --- .../plugin/replace/impl/ReplacementBuilder.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ReplacementBuilder.java b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ReplacementBuilder.java index 2ed02bbe48d8..fa72f06a7710 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ReplacementBuilder.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ReplacementBuilder.java @@ -16,6 +16,8 @@ import com.intellij.structuralsearch.impl.matcher.PatternTreeContext; import com.intellij.structuralsearch.impl.matcher.predicates.ScriptSupport; import com.intellij.structuralsearch.plugin.replace.ReplaceOptions; import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; @@ -186,6 +188,7 @@ public final class ReplacementBuilder { return scriptSupport.evaluate((MatchResultImpl)match, null); } + @Nullable public ParameterInfo findParameterization(String name) { if (parameterizations==null) return null; @@ -208,7 +211,7 @@ public final class ReplacementBuilder { } } - public void addParametrization(ParameterInfo e) { + public void addParametrization(@NotNull ParameterInfo e) { assert parameterizations != null; parameterizations.add(e); } From 20cb22363f5e1da5b375b48c534a6b89bac04f6f Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 21 Jul 2014 14:23:56 +0200 Subject: [PATCH 36/69] SSR: renaming --- .../JavaStructuralSearchProfile.java | 8 ++++---- .../StructuralSearchProfile.java | 2 +- .../plugin/replace/impl/ParameterInfo.java | 20 +++++++++---------- .../replace/impl/ReplacementBuilder.java | 4 ++-- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaStructuralSearchProfile.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaStructuralSearchProfile.java index 848228121d81..869f01cc7394 100644 --- a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaStructuralSearchProfile.java +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaStructuralSearchProfile.java @@ -411,7 +411,7 @@ public class JavaStructuralSearchProfile extends StructuralSearchProfile { final ParameterInfo initInfo = builder.findParameterization(Replacer.stripTypedVariableDecoration(initText)); if (initInfo != null) { - initInfo.setVariableInitialContext(true); + initInfo.setVariableInitializerContext(true); } } } @@ -448,8 +448,8 @@ public class JavaStructuralSearchProfile extends StructuralSearchProfile { ParameterInfo typeInfo = builder.findParameterization(type); if (nameInfo != null && typeInfo != null && !(parameter.getParent() instanceof PsiCatchSection)) { - nameInfo.setParameterContext(false); - typeInfo.setParameterContext(false); + nameInfo.setArgumentContext(false); + typeInfo.setArgumentContext(false); typeInfo.setMethodParameterContext(true); nameInfo.setMethodParameterContext(true); typeInfo.setElement(parameter.getTypeElement()); @@ -510,7 +510,7 @@ public class JavaStructuralSearchProfile extends StructuralSearchProfile { buf.append('\n'); } } - else if (info.isParameterContext()) { + else if (info.isArgumentContext()) { buf.append(','); } else if (parent instanceof PsiClass) { diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/StructuralSearchProfile.java b/platform/structuralsearch/source/com/intellij/structuralsearch/StructuralSearchProfile.java index ff7b379a161f..e40683dce04e 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/StructuralSearchProfile.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/StructuralSearchProfile.java @@ -237,7 +237,7 @@ public abstract class StructuralSearchProfile { final PsiElement currentElement = matchResult.getMatch(); if (buf.length() > 0) { - if (info.isParameterContext()) { + if (info.isArgumentContext()) { buf.append(','); } else { buf.append(' '); diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ParameterInfo.java b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ParameterInfo.java index 58f49f8bbd8c..3e232731bd88 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ParameterInfo.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ParameterInfo.java @@ -5,10 +5,10 @@ import com.intellij.psi.PsiElement; public final class ParameterInfo { private String name; private int startIndex; - private boolean parameterContext; + private boolean argumentContext; private boolean methodParameterContext; private boolean statementContext; - private boolean variableInitialContext; + private boolean variableInitializerContext; private int afterDelimiterPos; private boolean hasCommaBefore; private int beforeDelimiterPos; @@ -32,12 +32,12 @@ public final class ParameterInfo { this.startIndex = startIndex; } - public boolean isParameterContext() { - return parameterContext; + public boolean isArgumentContext() { + return argumentContext; } - public void setParameterContext(boolean parameterContext) { - this.parameterContext = parameterContext; + public void setArgumentContext(boolean argumentContext) { + this.argumentContext = argumentContext; } public boolean isMethodParameterContext() { @@ -56,12 +56,12 @@ public final class ParameterInfo { this.statementContext = statementContext; } - public boolean isVariableInitialContext() { - return variableInitialContext; + public boolean isVariableInitializerContext() { + return variableInitializerContext; } - public void setVariableInitialContext(boolean variableInitialContext) { - this.variableInitialContext = variableInitialContext; + public void setVariableInitializerContext(boolean variableInitializerContext) { + this.variableInitializerContext = variableInitializerContext; } public int getAfterDelimiterPos() { diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ReplacementBuilder.java b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ReplacementBuilder.java index fa72f06a7710..e72fd5555531 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ReplacementBuilder.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/ReplacementBuilder.java @@ -76,7 +76,7 @@ public final class ReplacementBuilder { info.setStatementContext(true); } else if (ch == ',' || ch == ')') { - info.setParameterContext(true); + info.setArgumentContext(true); info.setHasCommaAfter(ch == ','); } info.setAfterDelimiterPos(pos); @@ -160,7 +160,7 @@ public final class ReplacementBuilder { result.delete(info.getAfterDelimiterPos() + offset, info.getAfterDelimiterPos() + 1 + offset); --offset; } - else if (info.isVariableInitialContext()) { + else if (info.isVariableInitializerContext()) { //if (info.afterDelimiterPos > 0) { result.delete(info.getBeforeDelimiterPos() + offset, info.getAfterDelimiterPos() + offset - 1); offset -= (info.getAfterDelimiterPos() - info.getBeforeDelimiterPos() - 1); From fb786d36c06625a5d436cdcdd2350ce3c94e4870 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 21 Jul 2014 17:42:55 +0200 Subject: [PATCH 37/69] SSR: improve annotation name value pair matching --- .../impl/matcher/JavaMatchingVisitor.java | 22 ++++++++----------- .../StructuralSearchTest.java | 9 ++++++-- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchingVisitor.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchingVisitor.java index 401b84004858..0ea857b16362 100644 --- a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchingVisitor.java +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchingVisitor.java @@ -321,18 +321,14 @@ public class JavaMatchingVisitor extends JavaElementVisitor { @Override public void visitNameValuePair(PsiNameValuePair pair) { final PsiIdentifier nameIdentifier = pair.getNameIdentifier(); - if (nameIdentifier == null) { - myMatchingVisitor.setResult(true); - return; - } final PsiNameValuePair elementNameValuePair = (PsiNameValuePair)myMatchingVisitor.getElement(); - PsiIdentifier matchedNameValuePair = elementNameValuePair.getNameIdentifier(); + final PsiIdentifier otherIdentifier = elementNameValuePair.getNameIdentifier(); - PsiAnnotationMemberValue annotationInitializer = pair.getValue(); + final PsiAnnotationMemberValue annotationInitializer = pair.getValue(); if (annotationInitializer != null) { - boolean isTypedInitializer = myMatchingVisitor.getMatchContext().getPattern().isTypedVar(annotationInitializer) && - annotationInitializer instanceof PsiReferenceExpression; + final boolean isTypedInitializer = myMatchingVisitor.getMatchContext().getPattern().isTypedVar(annotationInitializer) && + annotationInitializer instanceof PsiReferenceExpression; myMatchingVisitor.setResult(myMatchingVisitor.match(annotationInitializer, elementNameValuePair.getValue()) || (isTypedInitializer && @@ -344,13 +340,13 @@ public class JavaMatchingVisitor extends JavaElementVisitor { final MatchingHandler handler = myMatchingVisitor.getMatchContext().getPattern().getHandler(nameIdentifier); if (handler instanceof SubstitutionHandler) { - myMatchingVisitor - .setResult(((SubstitutionHandler)handler).handle(matchedNameValuePair, - myMatchingVisitor.getMatchContext())); + myMatchingVisitor.setResult(((SubstitutionHandler)handler).handle(otherIdentifier, myMatchingVisitor.getMatchContext())); + } + else if (nameIdentifier != null) { + myMatchingVisitor.setResult(myMatchingVisitor.match(nameIdentifier, otherIdentifier)); } else { - myMatchingVisitor - .setResult(myMatchingVisitor.match(nameIdentifier, matchedNameValuePair)); + myMatchingVisitor.setResult(otherIdentifier == null || otherIdentifier.getText().equals("value")); } } } diff --git a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java index 18e5e8e1ea5e..da479a70f93c 100644 --- a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java +++ b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java @@ -2288,14 +2288,19 @@ public class StructuralSearchTest extends StructuralSearchTestCase { "@MyBean2(\"\")\n" + "public class TestBean {}\n" + "@MyBean2(\"\")\n" + - "@MyBean(\"\")\n" + + "@MyBean(value=\"\")\n" + "public class TestBean2 {}\n" + - "public class TestBean3 {}\n"; + "public class TestBean3 {}\n" + + "@MyBean(\"a\")\n" + + "@MyBean2(\"a\")\n" + + "public class TestBean4"; String s2 = "@MyBean(\"\")\n" + "@MyBean2(\"\")\n" + "public class $a$ {}\n"; assertEquals("Simple find annotated class",2,findMatchesCount(s1,s2,false)); + assertEquals("Match value of anonymous name value pair 1", 1, findMatchesCount(s1, "@MyBean(\"a\") class $a$ {}")); + assertEquals("Match value of anonymous name value pair 2", 2, findMatchesCount(s1, "@MyBean(\"\") class $a$ {}")); String s3 = "@VisualBean(\"????????? ?????????? ? ??\")\n" + "public class TestBean\n" + From 89dc52824285c23faa381eb0ba2f4bff8df5e0ff Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 21 Jul 2014 13:17:23 +0200 Subject: [PATCH 38/69] new inference: no substitution during most specific inference by means of new spec (IDEA-127584) --- .../graphInference/InferenceSession.java | 16 +++++++------- .../JavaMethodsConflictResolver.java | 13 +++++------ .../lambda/mostSpecific/IDEA127584.java | 22 +++++++++++++++++++ .../lambda/MostSpecificResolutionTest.java | 4 ++++ 4 files changed, 40 insertions(+), 15 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/IDEA127584.java diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java index 57d197e1ce66..6098199c591c 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java @@ -1021,13 +1021,13 @@ public class InferenceSession { */ public static boolean isMoreSpecific(PsiMethod m1, PsiMethod m2, - PsiSubstitutor siteSubstitutor2, PsiExpression[] args, PsiElement context, boolean varargs) { - final PsiTypeParameter[] typeParameters = m2.getTypeParameters(); - - final InferenceSession session = new InferenceSession(typeParameters, siteSubstitutor2, m2.getManager(), context); + final InferenceSession session = new InferenceSession(PsiTypeParameter.EMPTY_ARRAY, PsiSubstitutor.EMPTY, m2.getManager(), context); + for (PsiTypeParameter param : PsiUtil.typeParametersIterable(m2)) { + session.initBounds(param); + } final PsiParameter[] parameters1 = m1.getParameterList().getParameters(); final PsiParameter[] parameters2 = m2.getParameterList().getParameters(); @@ -1037,8 +1037,8 @@ public class InferenceSession { final int paramsLength = !varargs ? parameters1.length : parameters1.length - 1; for (int i = 0; i < paramsLength; i++) { - PsiType sType = getParameterType(parameters1, i, siteSubstitutor2, false); - PsiType tType = getParameterType(parameters2, i, siteSubstitutor2, varargs); + PsiType sType = getParameterType(parameters1, i, PsiSubstitutor.EMPTY, false); + PsiType tType = getParameterType(parameters2, i, PsiSubstitutor.EMPTY, varargs); if (session.isProperType(sType) && session.isProperType(tType)) { if (!TypeConversionUtil.isAssignable(tType, sType)) { return false; @@ -1055,8 +1055,8 @@ public class InferenceSession { } if (varargs) { - PsiType sType = getParameterType(parameters1, paramsLength, siteSubstitutor2, true); - PsiType tType = getParameterType(parameters2, paramsLength, siteSubstitutor2, true); + PsiType sType = getParameterType(parameters1, paramsLength, PsiSubstitutor.EMPTY, true); + PsiType tType = getParameterType(parameters2, paramsLength, PsiSubstitutor.EMPTY, true); session.addConstraint(new StrictSubtypingConstraint(tType, sType)); } diff --git a/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java b/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java index f136c843aa87..59083c625f82 100644 --- a/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java +++ b/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java @@ -550,10 +550,10 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ final PsiSubstitutor methodSubstitutor1 = calculateMethodSubstitutor(typeParameters1, method1, siteSubstitutor1, types1, types2AtSite, languageLevel); - boolean applicable12 = isApplicableTo(types2AtSite, method1, languageLevel, varargsPosition, methodSubstitutor1, method2, siteSubstitutor1); + boolean applicable12 = isApplicableTo(types2AtSite, method1, languageLevel, varargsPosition, methodSubstitutor1, method2); final PsiSubstitutor methodSubstitutor2 = calculateMethodSubstitutor(typeParameters2, method2, siteSubstitutor2, types2, types1AtSite, languageLevel); - boolean applicable21 = isApplicableTo(types1AtSite, method2, languageLevel, varargsPosition, methodSubstitutor2, method1, siteSubstitutor2); + boolean applicable21 = isApplicableTo(types1AtSite, method2, languageLevel, varargsPosition, methodSubstitutor2, method1); if (!myLanguageLevel.isAtLeast(LanguageLevel.JDK_1_8)) { final boolean typeArgsApplicable12 = GenericsUtil.isTypeArgumentsApplicable(typeParameters1, methodSubstitutor1, myArgumentsList, !applicable21); @@ -604,9 +604,9 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ if (toCompareFunctional) { final boolean applicable12ignoreFunctionalType = isApplicableTo(types2AtSite, method1, languageLevel, varargsPosition, - calculateMethodSubstitutor(typeParameters1, method1, siteSubstitutor1, types1, types2AtSite, languageLevel), null, null); + calculateMethodSubstitutor(typeParameters1, method1, siteSubstitutor1, types1, types2AtSite, languageLevel), null); final boolean applicable21ignoreFunctionalType = isApplicableTo(types1AtSite, method2, languageLevel, varargsPosition, - calculateMethodSubstitutor(typeParameters2, method2, siteSubstitutor2, types2, types1AtSite, languageLevel), null, null); + calculateMethodSubstitutor(typeParameters2, method2, siteSubstitutor2, types2, types1AtSite, languageLevel), null); if (applicable12ignoreFunctionalType || applicable21ignoreFunctionalType) { Specifics specifics = null; @@ -694,12 +694,11 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ @NotNull LanguageLevel languageLevel, boolean varargsPosition, @NotNull PsiSubstitutor methodSubstitutor1, - PsiMethod method2, - PsiSubstitutor siteSubstitutor1) { + PsiMethod method2) { if (languageLevel.isAtLeast(LanguageLevel.JDK_1_8) && method2 != null && method1.getTypeParameters().length > 0 && myArgumentsList instanceof PsiExpressionList) { final PsiElement parent = myArgumentsList.getParent(); if (parent instanceof PsiCallExpression && ((PsiCallExpression)parent).getTypeArguments().length == 0) { - return InferenceSession.isMoreSpecific(method2, method1, siteSubstitutor1, ((PsiExpressionList)myArgumentsList).getExpressions(), myArgumentsList, varargsPosition); + return InferenceSession.isMoreSpecific(method2, method1, ((PsiExpressionList)myArgumentsList).getExpressions(), myArgumentsList, varargsPosition); } } final int applicabilityLevel = PsiUtil.getApplicabilityLevel(method1, methodSubstitutor1, types2AtSite, languageLevel, false, varargsPosition); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/IDEA127584.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/IDEA127584.java new file mode 100644 index 000000000000..f1222505a708 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/IDEA127584.java @@ -0,0 +1,22 @@ +class Test { + public static Future foo(Future future, Function function) { + return future.map(function); + } + + // These interfaces inspired by FoundationDB Java client class files + interface PartialFunction { + VP apply(TP t) throws java.lang.Exception; + } + + interface Function extends PartialFunction { + VF apply(TF t); + } + + interface PartialFuture { + PartialFuture map(PartialFunction partialFunction); + } + + interface Future extends PartialFuture { + Future map(Function function); + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MostSpecificResolutionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MostSpecificResolutionTest.java index 7a73bfed6cbd..9bb7d4801944 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MostSpecificResolutionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MostSpecificResolutionTest.java @@ -111,6 +111,10 @@ public class MostSpecificResolutionTest extends LightDaemonAnalyzerTestCase { doTest(); } + public void testIDEA127584() throws Exception { + doTest(); + } + private void doTest() { doTest(true); } From a46f4cef5229fe8e9c327b588592756110f3adb7 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 21 Jul 2014 15:23:47 +0200 Subject: [PATCH 39/69] anonym -> lambda: disable in case when inferred type differs from type of anonymous class and parameter of param type is used inside (IDEA-127603); BTW param.toString would be also rejected --- .../AnonymousCanBeLambdaInspection.java | 35 ++++++++++--------- ...onymousCanBeMethodReferenceInspection.java | 2 +- .../beforeObjectInferredButIntExpected.java | 16 +++++++++ 3 files changed, 35 insertions(+), 18 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeObjectInferredButIntExpected.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java index 96066c34eefe..c1f127d3a1df 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java @@ -32,10 +32,7 @@ import com.intellij.psi.controlFlow.ControlFlow; import com.intellij.psi.controlFlow.ControlFlowUtil; import com.intellij.psi.impl.source.resolve.DefaultParameterTypeInferencePolicy; import com.intellij.psi.infos.MethodCandidateInfo; -import com.intellij.psi.util.InheritanceUtil; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.util.PsiTypesUtil; -import com.intellij.psi.util.PsiUtil; +import com.intellij.psi.util.*; import com.intellij.util.ArrayUtilRt; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtilRt; @@ -91,16 +88,12 @@ public class AnonymousCanBeLambdaInspection extends BaseJavaBatchLocalInspection final PsiMethod[] methods = aClass.getMethods(); if (methods.length == 1 && aClass.getFields().length == 0) { final PsiCodeBlock body = methods[0].getBody(); - if (body != null) { - final ForbiddenRefsChecker checker = new ForbiddenRefsChecker(methods[0], aClass); - body.accept(checker); - if (!checker.hasForbiddenRefs()) { - final PsiElement lBrace = aClass.getLBrace(); - LOG.assertTrue(lBrace != null); - final TextRange rangeInElement = new TextRange(0, aClass.getStartOffsetInParent() + lBrace.getStartOffsetInParent()); - holder.registerProblem(aClass.getParent(), "Anonymous #ref #loc can be replaced with lambda", - ProblemHighlightType.LIKE_UNUSED_SYMBOL, rangeInElement, new ReplaceWithLambdaFix()); - } + if (body != null && !hasForbiddenRefsInsideBody(methods[0], aClass)) { + final PsiElement lBrace = aClass.getLBrace(); + LOG.assertTrue(lBrace != null); + final TextRange rangeInElement = new TextRange(0, aClass.getStartOffsetInParent() + lBrace.getStartOffsetInParent()); + holder.registerProblem(aClass.getParent(), "Anonymous #ref #loc can be replaced with lambda", + ProblemHighlightType.LIKE_UNUSED_SYMBOL, rangeInElement, new ReplaceWithLambdaFix()); } } } @@ -110,6 +103,14 @@ public class AnonymousCanBeLambdaInspection extends BaseJavaBatchLocalInspection }; } + public static boolean hasForbiddenRefsInsideBody(PsiMethod method, PsiAnonymousClass aClass) { + final ForbiddenRefsChecker checker = new ForbiddenRefsChecker(method, aClass); + final PsiCodeBlock body = method.getBody(); + LOG.assertTrue(body != null); + body.accept(checker); + return checker.hasForbiddenRefs(); + } + private static PsiType getInferredType(PsiAnonymousClass aClass) { final PsiExpression expression = (PsiExpression)aClass.getParent(); final PsiType psiType = PsiTypesUtil.getExpectedTypeByParent(expression); @@ -369,14 +370,14 @@ public class AnonymousCanBeLambdaInspection extends BaseJavaBatchLocalInspection private final PsiMethod myMethod; private final PsiAnonymousClass myAnonymClass; - private final boolean myRawType; + private final boolean myEqualInference; public ForbiddenRefsChecker(PsiMethod method, PsiAnonymousClass aClass) { myMethod = method; myAnonymClass = aClass; final PsiType inferredType = getInferredType(aClass); - myRawType = inferredType instanceof PsiClassType && ((PsiClassType)inferredType).isRaw(); + myEqualInference = !aClass.getBaseClassType().equals(inferredType); } @Override @@ -467,7 +468,7 @@ public class AnonymousCanBeLambdaInspection extends BaseJavaBatchLocalInspection } } - if (myRawType) { + if (myEqualInference) { final PsiElement resolved = expression.resolve(); if (resolved instanceof PsiParameter && ((PsiParameter)resolved).getDeclarationScope() == myMethod) { final int parameterIndex = myMethod.getParameterList().getParameterIndex((PsiParameter)resolved); diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeMethodReferenceInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeMethodReferenceInspection.java index d6a884c8917c..c3363ec7eb12 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeMethodReferenceInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeMethodReferenceInspection.java @@ -69,7 +69,7 @@ public class AnonymousCanBeMethodReferenceInspection extends BaseJavaBatchLocalI final PsiClassType baseClassType = aClass.getBaseClassType(); if (LambdaUtil.isFunctionalType(baseClassType)) { final PsiMethod[] methods = aClass.getMethods(); - if (methods.length == 1 && aClass.getFields().length == 0) { + if (methods.length == 1 && aClass.getFields().length == 0 && !AnonymousCanBeLambdaInspection.hasForbiddenRefsInsideBody(methods[0], aClass)) { final PsiCodeBlock body = methods[0].getBody(); final PsiCallExpression callExpression = LambdaCanBeMethodReferenceInspection diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeObjectInferredButIntExpected.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeObjectInferredButIntExpected.java new file mode 100644 index 000000000000..3a82478ec678 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeObjectInferredButIntExpected.java @@ -0,0 +1,16 @@ +// "Replace with lambda" "false" +import java.util.function.Function; + +class Test { + void ab() { + comparing(new Function() { + public String apply(Integer pObj) { + return Integer.toString(pObj); + } + }); + + } + + static void comparing(Function keyExtractor){} + +} From ae4f3d96ecc2bb64c610b03ba86ef92336b4cc2d Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 21 Jul 2014 16:35:00 +0200 Subject: [PATCH 40/69] unwrap: adjust caret before RParenth (IDEA-127580) --- .../unwrap/JavaMethodParameterUnwrapper.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/unwrap/JavaMethodParameterUnwrapper.java b/java/java-impl/src/com/intellij/codeInsight/unwrap/JavaMethodParameterUnwrapper.java index ec771e43c073..1c1957bcf472 100644 --- a/java/java-impl/src/com/intellij/codeInsight/unwrap/JavaMethodParameterUnwrapper.java +++ b/java/java-impl/src/com/intellij/codeInsight/unwrap/JavaMethodParameterUnwrapper.java @@ -29,15 +29,23 @@ public class JavaMethodParameterUnwrapper extends JavaUnwrapper { super(""); } + private static PsiElement adjustElementToTheLeft(PsiElement element) { + if (element instanceof PsiJavaToken && ((PsiJavaToken)element).getTokenType() == JavaTokenType.RPARENTH) { + return element.getPrevSibling(); + } + return element; + } + @Override public String getDescription(PsiElement e) { - String text = e.getText(); + String text = adjustElementToTheLeft(e).getText(); if (text.length() > 20) text = text.substring(0, 17) + "..."; return CodeInsightBundle.message("unwrap.with.placeholder", text); } @Override public boolean isApplicableTo(PsiElement e) { + e = adjustElementToTheLeft(e); final PsiElement parent = e.getParent(); if (e instanceof PsiExpression){ if (parent instanceof PsiExpressionList) { @@ -62,6 +70,7 @@ public class JavaMethodParameterUnwrapper extends JavaUnwrapper { @Override public PsiElement collectAffectedElements(PsiElement e, List toExtract) { + e = adjustElementToTheLeft(e); super.collectAffectedElements(e, toExtract); return isTopLevelCall(e) ? e.getParent() : e.getParent().getParent(); } @@ -73,6 +82,7 @@ public class JavaMethodParameterUnwrapper extends JavaUnwrapper { @Override protected void doUnwrap(PsiElement element, Context context) throws IncorrectOperationException { + element = adjustElementToTheLeft(element); PsiElement methodCall = isTopLevelCall(element) ? element.getParent() : element.getParent().getParent(); final PsiElement extractedElement = isTopLevelCall(element) ? getArg(element) : element; context.extractElement(extractedElement, methodCall); From 824f4329b276b4d61eb10265239e8b4a846977b5 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 21 Jul 2014 17:49:29 +0200 Subject: [PATCH 41/69] workaround for

inside

 in javadoc preview in
 JEditorPane (IDEA-127430)

---
 .../codeInsight/javadoc/JavaDocInfoGenerator.java      |  1 +
 .../testData/codeInsight/javadocIG/pInsidePre.html     |  6 ++++++
 .../testData/codeInsight/javadocIG/pInsidePre.java     | 10 ++++++++++
 .../codeInsight/javadoc/JavaDocInfoGeneratorTest.java  |  4 ++++
 4 files changed, 21 insertions(+)
 create mode 100644 java/java-tests/testData/codeInsight/javadocIG/pInsidePre.html
 create mode 100644 java/java-tests/testData/codeInsight/javadocIG/pInsidePre.java

diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java b/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java
index eefe8cf393ac..f80457c676b8 100644
--- a/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java
+++ b/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java
@@ -218,6 +218,7 @@ public class JavaDocInfoGenerator {
       LOG.debug(text);
     }
 
+    text = StringUtil.replaceIgnoreCase(text, "

", "

"); return StringUtil.replace(text, "/>", ">"); } diff --git a/java/java-tests/testData/codeInsight/javadocIG/pInsidePre.html b/java/java-tests/testData/codeInsight/javadocIG/pInsidePre.html new file mode 100644 index 000000000000..fbfd2983208a --- /dev/null +++ b/java/java-tests/testData/codeInsight/javadocIG/pInsidePre.html @@ -0,0 +1,6 @@ + Test
public String field = null
+
+         foo
+         

+ bar +
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/pInsidePre.java b/java/java-tests/testData/codeInsight/javadocIG/pInsidePre.java new file mode 100644 index 000000000000..0627e4b99510 --- /dev/null +++ b/java/java-tests/testData/codeInsight/javadocIG/pInsidePre.java @@ -0,0 +1,10 @@ +class Test { + /** + *
+   *     foo
+   *     

+ * bar + *

+ */ + public String field = null; +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorTest.java index 454bb7f97a58..a4de0bcdcab8 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorTest.java @@ -88,6 +88,10 @@ public class JavaDocInfoGeneratorTest extends CodeInsightTestCase { doTestField(); } + public void testPInsidePre() throws Exception { + doTestField(); + } + public void testEnumConstantOrdinal() throws Exception { PsiClass psiClass = getTestClass(); PsiField field = psiClass.getFields() [0]; From 72925dfebbe95c26350ee2d76eef17682a9d8e10 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 21 Jul 2014 17:52:33 +0200 Subject: [PATCH 42/69] pointless expressions: do not simplify a - b - b to a - 0 --- .../numeric/PointlessArithmeticExpressionInspection.java | 7 ++++--- .../PointlessArithmeticExpression.java | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/numeric/PointlessArithmeticExpressionInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/numeric/PointlessArithmeticExpressionInspection.java index bebf5a559d15..023b4bc9f949 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/numeric/PointlessArithmeticExpressionInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/numeric/PointlessArithmeticExpressionInspection.java @@ -105,7 +105,7 @@ public class PointlessArithmeticExpressionInspection fromTarget = (i == length - 1) ? polyadicExpression.getTokenBeforeOperand(operand) : operand; break; } - else if ((tokenType.equals(JavaTokenType.MINUS) || tokenType.equals(JavaTokenType.DIV)) && + else if ((tokenType.equals(JavaTokenType.MINUS) && i == 1 || tokenType.equals(JavaTokenType.DIV)) && EquivalenceChecker.expressionsAreEquivalent(previousOperand, operand)) { fromTarget = previousOperand; untilTarget = operand; @@ -229,9 +229,10 @@ public class PointlessArithmeticExpressionInspection private boolean subtractionExpressionIsPointless(PsiExpression[] expressions) { PsiExpression previousExpression = null; - for (PsiExpression expression : expressions) { + for (int i = 0; i < expressions.length; i++) { + PsiExpression expression = expressions[i]; if (previousExpression != null && - (isZero(expression) || EquivalenceChecker.expressionsAreEquivalent(previousExpression, expression))) { + (isZero(expression) || i == 1 && EquivalenceChecker.expressionsAreEquivalent(previousExpression, expression))) { return true; } previousExpression = expression; diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/numeric/pointless_arithmetic_expression/PointlessArithmeticExpression.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/numeric/pointless_arithmetic_expression/PointlessArithmeticExpression.java index 019805adcf17..4ba7a97033ad 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/numeric/pointless_arithmetic_expression/PointlessArithmeticExpression.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/numeric/pointless_arithmetic_expression/PointlessArithmeticExpression.java @@ -124,4 +124,5 @@ class Expanded {{ long g = 8L / 8L; long h = 9L * 0L; int a = 8 * 0 * 8 * ; // don't warn + int minus = 2 - 1 - 1; }} \ No newline at end of file From 43ab48e1308b3ff891f9d455673d7e38eaf9ff98 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 21 Jul 2014 17:54:06 +0200 Subject: [PATCH 43/69] + getErrorsCount() --- .../openapi/roots/ui/configuration/ErrorPaneConfigurable.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ErrorPaneConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ErrorPaneConfigurable.java index 1ca83e0705d7..6546eb1cf5cf 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ErrorPaneConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ErrorPaneConfigurable.java @@ -205,4 +205,8 @@ public class ErrorPaneConfigurable extends JPanel implements Configurable, Dispo myErrors.remove(error); refresh(); } + + public int getErrorsCount() { + return myErrors.size(); + } } From 67cbc12ea200f244021aa34cfdc9fc8b3670495c Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 21 Jul 2014 17:54:51 +0200 Subject: [PATCH 44/69] allow to override layouting algorithm --- .../src/com/intellij/ui/GroupedElementsRenderer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-api/src/com/intellij/ui/GroupedElementsRenderer.java b/platform/platform-api/src/com/intellij/ui/GroupedElementsRenderer.java index 1651757935c9..76bacb9cb452 100644 --- a/platform/platform-api/src/com/intellij/ui/GroupedElementsRenderer.java +++ b/platform/platform-api/src/com/intellij/ui/GroupedElementsRenderer.java @@ -130,7 +130,7 @@ public abstract class GroupedElementsRenderer { public abstract static class List extends GroupedElementsRenderer { @Override - protected final void layout() { + protected void layout() { myRendererComponent.add(mySeparatorComponent, BorderLayout.NORTH); myRendererComponent.add(myComponent, BorderLayout.CENTER); } From b198c6a59879412bd150ec41373cdf5bdeb03c67 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 21 Jul 2014 17:55:25 +0200 Subject: [PATCH 45/69] add Problems counter --- .../roots/ui/configuration/SidePanel.java | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/SidePanel.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/SidePanel.java index 14d696f3415b..07273d584f65 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/SidePanel.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/SidePanel.java @@ -16,10 +16,13 @@ package com.intellij.openapi.roots.ui.configuration; import com.intellij.openapi.actionSystem.Presentation; +import com.intellij.openapi.ui.GraphicsConfig; import com.intellij.openapi.ui.popup.ListItemDescriptor; import com.intellij.openapi.util.registry.Registry; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.*; import com.intellij.ui.components.JBList; +import com.intellij.ui.components.panels.NonOpaquePanel; import com.intellij.ui.navigation.History; import com.intellij.ui.navigation.Place; import com.intellij.ui.popup.list.GroupedItemsListRenderer; @@ -29,6 +32,7 @@ import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import javax.swing.*; +import javax.swing.border.Border; import javax.swing.border.EmptyBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; @@ -94,6 +98,8 @@ public class SidePanel extends JPanel { }; myList.setCellRenderer(new GroupedItemsListRenderer(descriptor) { + JPanel myExtraPanel; + CountLabel myCountLabel; { mySeparatorComponent.setCaptionCentered(false); } @@ -136,8 +142,38 @@ public class SidePanel extends JPanel { }; } + @Override + protected void layout() { + if (Registry.is("ide.new.project.settings")) { + myRendererComponent.add(mySeparatorComponent, BorderLayout.NORTH); + myExtraPanel.add(myComponent, BorderLayout.CENTER); + myExtraPanel.add(myCountLabel, BorderLayout.EAST); + myRendererComponent.add(myExtraPanel, BorderLayout.CENTER); + } else { + super.layout(); + } + } + + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + myCountLabel.setText(""); + final Component component = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if ("Problems".equals(descriptor.getTextFor(value))) { + final ErrorPaneConfigurable errorPane = (ErrorPaneConfigurable)((Place)value).getPath("category"); + if (errorPane != null && errorPane.getErrorsCount() > 0) { + myCountLabel.setSelected(isSelected); + myCountLabel.setText(String.valueOf(errorPane.getErrorsCount())); + } + } + return component; + } + @Override protected JComponent createItemComponent() { + myExtraPanel = new NonOpaquePanel(new BorderLayout()); + myCountLabel = new CountLabel(); + + if (Registry.is("ide.new.project.settings")) { myTextLabel = new EngravedLabel(); myTextLabel.setFont(myTextLabel.getFont().deriveFont(Font.BOLD)); @@ -188,4 +224,51 @@ public class SidePanel extends JPanel { public void select(final Place place) { myList.setSelectedValue(place, true); } + + private static class CountLabel extends JLabel { + private boolean mySelected; + + public CountLabel() { + super(); + setBorder(new Border() { + @Override + public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { + } + + @Override + public Insets getBorderInsets(Component c) { + return StringUtil.isEmpty(getText()) ? new Insets(0,0,0,0) : new Insets(2, 6, 2, 6 + 6); + } + + @Override + public boolean isBorderOpaque() { + return false; + } + }); + setFont(UIUtil.getListFont().deriveFont(Font.BOLD)); + } + + public boolean isSelected() { + return mySelected; + } + + public void setSelected(boolean selected) { + mySelected = selected; + } + + @Override + protected void paintComponent(Graphics g) { + g.setColor(isSelected() ? UIUtil.getListSelectionBackground() : UIUtil.getSidePanelColor()); + g.fillRect(0, 0, getWidth(), getHeight()); + if (StringUtil.isEmpty(getText())) return; + final JBColor deepBlue = new JBColor(new Color(0x97A4B2), new Color(0x97A4B2)); + g.setColor(isSelected() ? Gray._255.withAlpha(220) : deepBlue); + final GraphicsConfig config = GraphicsUtil.setupAAPainting(g); + g.fillRoundRect(0, 3, getWidth() - 6 -1, getHeight()-6 , (getHeight() - 6), (getHeight() - 6)); + config.restore(); + setForeground(isSelected() ? deepBlue.darker() : UIUtil.getListForeground(true)); + + super.paintComponent(g); + } + } } From 79a933ce5bfdfb869f33d46b6ae10b7e1ec26d0c Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 21 Jul 2014 18:07:50 +0200 Subject: [PATCH 46/69] update problems counter for Darcula --- .../intellij/openapi/roots/ui/configuration/SidePanel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/SidePanel.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/SidePanel.java index 07273d584f65..c955f5695a54 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/SidePanel.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/SidePanel.java @@ -261,8 +261,8 @@ public class SidePanel extends JPanel { g.setColor(isSelected() ? UIUtil.getListSelectionBackground() : UIUtil.getSidePanelColor()); g.fillRect(0, 0, getWidth(), getHeight()); if (StringUtil.isEmpty(getText())) return; - final JBColor deepBlue = new JBColor(new Color(0x97A4B2), new Color(0x97A4B2)); - g.setColor(isSelected() ? Gray._255.withAlpha(220) : deepBlue); + final JBColor deepBlue = new JBColor(new Color(0x97A4B2), new Color(92, 98, 113)); + g.setColor(isSelected() ? Gray._255.withAlpha(UIUtil.isUnderDarcula() ? 100 : 220) : deepBlue); final GraphicsConfig config = GraphicsUtil.setupAAPainting(g); g.fillRoundRect(0, 3, getWidth() - 6 -1, getHeight()-6 , (getHeight() - 6), (getHeight() - 6)); config.restore(); From 22a396424674ce79d74e024bb08aec578182bfb3 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 21 Jul 2014 18:24:12 +0200 Subject: [PATCH 47/69] +getList() to access configurables list --- .../intellij/openapi/roots/ui/configuration/SidePanel.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/SidePanel.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/SidePanel.java index c955f5695a54..290f35e561b5 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/SidePanel.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/SidePanel.java @@ -205,6 +205,10 @@ public class SidePanel extends JPanel { }); } + public JList getList() { + return myList; + } + public void addPlace(Place place, @NotNull Presentation presentation) { myModel.addElement(place); myPlaces.add(place); From 02939b8f7c84fff07ab64f77248fbf020597aa6e Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 21 Jul 2014 18:25:08 +0200 Subject: [PATCH 48/69] add problems listener to update counter --- .../roots/ui/configuration/ErrorPaneConfigurable.java | 7 ++++++- .../ui/configuration/ProjectStructureConfigurable.java | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ErrorPaneConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ErrorPaneConfigurable.java index 6546eb1cf5cf..77ccbe6cbdff 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ErrorPaneConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ErrorPaneConfigurable.java @@ -45,9 +45,11 @@ public class ErrorPaneConfigurable extends JPanel implements Configurable, Dispo private final Alarm myAlarm; private final ArrayList myErrors = new ArrayList(); private final JTextPane myContent = new JTextPane(); + private Runnable myOnErrorsChanged; - public ErrorPaneConfigurable(final Project project, StructureConfigurableContext context) { + public ErrorPaneConfigurable(final Project project, StructureConfigurableContext context, Runnable onErrorsChanged) { super(new BorderLayout()); + myOnErrorsChanged = onErrorsChanged; myContent.setEditorKit(UIUtil.getHTMLEditorKit()); myContent.setEditable(false); myContent.setBackground(UIUtil.getListBackground()); @@ -148,6 +150,9 @@ public class ErrorPaneConfigurable extends JPanel implements Configurable, Dispo } html += ""; myContent.setText(html); + if (myOnErrorsChanged != null) { + myOnErrorsChanged.run(); + } } }, 100); } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java index a5ae27a7a158..bf083f92c66c 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java @@ -302,7 +302,12 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se } private void addErrorPane() { - addConfigurable(new ErrorPaneConfigurable(myProject, myContext), true); + addConfigurable(new ErrorPaneConfigurable(myProject, myContext, new Runnable() { + @Override + public void run() { + mySidePanel.getList().repaint(); + } + }), true); } private void addGlobalLibrariesConfig() { From ff16ce78a1e0ddb6e67fd1dbc6e6a597e20d483a Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 21 Jul 2014 18:48:45 +0200 Subject: [PATCH 49/69] update about graphics --- .../src/idea_community_about.png | Bin 80521 -> 62151 bytes .../src/idea_community_about@2x.png | Bin 233223 -> 214572 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/community-resources/src/idea_community_about.png b/community-resources/src/idea_community_about.png index d5e5a353e8ef74c8b1c5ebd1b15e3d42620786ff..79fe896536baefeadfa2ac57a4005d7cbc6e27e4 100644 GIT binary patch literal 62151 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

piN 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%0DhjEal|NKK( z;{9Lvd)sm?&2chC_skjC=O!J*${;2Bh2=N?i{|+Ddp=3g9@7LNPn^fFe;0fXML;wV zb8q}NL6P0}{)|5s@-S-V(plK{v2A-i`2v@&|L{Kn7xg{oQ?4*u+K7lLDBk`2Eh%)20eEid(h6S7dNdzTt5gXJpfU93q7LCi8E751z2&10RDC8oE&~{QvB| z2ecg5nI71cL+9{bzZ~!$G6;|aa}X#}4AM}d!j4yy$D`G;*WNikUZ1sR_t@+4S&zp% zGnRL}N1oY9@{FXBC5s6p0Wc?!1W14&G9Kc~xpS

Z<+kt?KIP01%RfGAaF^T91wD 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\diE&C+XLNnS%+5V{cLp z5Jl-`%BM1cyj352&Ef9Skrc;XbZwuXM|b8=;r;zU6B@4D+p6WHklxT=e7&P6PB!o_ zn(7D)RCVX?-{8TzrF*PS1)Md%G+!6w2^kqD+Ioa5lmRoq#rk~%$z#ebm*wMfrD2^4 z1fpD5zn7CS6SINQjxiEEj^_7BlP>%$Xnn`OBT_JjC zI({(Sw4O@hwC0ae45tX2`kQEaXG4C zw3QX+*acEk<(}Q>y8qWXw~%GJI%c43f%YZjBAeg_KxXl5%*(MS;6d-dT|$_=b3agG zb%O-G4%NqHiTd_=Q~m}EJb4aKnb;lCJ|D&fSav39nEQT5-IfW04qf> zj*N=R5W?308K3El?vS;jEVyZLcX*pzzZ02IGz%LEgJ;J0Bir4%RlU*4kW-O*0a>_t ze@a)Evu~?Bq=_OZP-+6ZKg8oPL{cju`eJX?W?~Nscp8nkO(LsEptuyc8A!I1N_quO zw)sjtO<%3P*gMr?hKkR5{P`|Mi-8<%gVS}Ru1VNVa(}vLI)KkZg)H`!n#@X(vUi%- zX2V@k3F%;iR=#6~>RV{uV$)mEqEHt}86+10)O4-E=Hx(bE&&T=%dHH^r}$FnP*pr; zM(yO_p(3H1Ys_g=A4_BFYD4XAV!g@BC!w34YCL7FO;cV}1^reqW_M`40{ig}aXTE) zdA(h$Pv>5P|M6O6x*4mW?~5Q(6>qb#tE6Bmj6o)Qdfg5TH9?AwPfNXAo6Xi^$>hPy z5+TIO2n<@drIePj_9|SSHf@~BF!T_^FbUgwOp<$MI5I7-r0mj6QpxN19Ls5$VNh6J zXuf}gG?Kf83|4jAvG@`FbVOh65uyZ3N`PR-3fo~O)TI`-8z+TrZ7V?PX5_|x_&a%e zCjUgdLc2_@%&i?COeJRI zl?kd81@un-5_^MeNYZp(ZXa2yV7ob_y5h=nET@0}#jI6gnpHhaY=}yPX_KL-)Ns5i zVSb|Pgtg*HV*|k!2PHbDxh9DOE%`><`fpB|8hhfveXQGAh}%Bl4En1`7@9Y5EP$IN$1c!{FDC3^@%eER-_xp~bu& z@Yc*48)HS$-6B=SuA8pP!sFf3vP>n2r5E@7Ozg-!+-pU_}UMft6OXG#xH1`0dD zn9qZCekmZroxzb?II11vRQ$`U=@v*C1I*kM&aoRHRg!|5570%WP|ybktpti^N~9Xc zZc*N@;K+Ru;zS)>JGANU<-Uf;i3VOPx4e3ZS6SR?N5$_R8VCYqDwNgVoVWlfWO;1srtYQcP08a{+jhGQf-uJjp;k>j&;-C zGWq*gxE<0*i;nU{K9i z48guK6P*lXcKw41BLx{(M~btXJ-xlZC?*zq0+Zxkc&2sZ-gJYHFRQ3Ivx4UdhrDd5QO&gS|xRKe|6#sbt?c8@gWD(1@y-TcLeubkM> z@hDR4-s5;sG(6VhB3eDAqQ3n;9;X_VYunUDJ&{d$gc$$e6AkD4CyV}uL5dHj?Tx5Z z8GkQvj-WystMMD^vbxpF;C-7eWO&9UIQQ(KIiul{41CD>xLMU~>r_vr?J>Y_H-Qa$ zWU#!stZMZg&!kA4eLnY2IQ~^Ib^8E;fkeMezsnlOS!*{ca(M^Al-aeQF-ig(%l~2g{u(>uu&8ZvFI8;=Mj@*y?*+x#yeS_7&G9nBT8!XVi1w9ugNhQRN?n zH#1gvQ+IOFsaf^1Si@@rCnjZrWbYqi>2z!ATB*E>XM>1&S> z_{YzFCTJ-vik)MWmOVOD2^Va>B7UvAGcLwweYNE|xNzaNzDm4!ku+Kaxo9|@pOUg1 zG_9XA%)iE49YmJt54MlbyTSKAJ8`QXUk2BueuFz9;lJC^ z%-dtCEb$X4Yc*r=#q~gurN($3k5e3?fp~ob*fQmU^3j%4&kk!%Crgq&o{nklpbQ z6{PA^Yj)Iivs)iXe?tCV%MO4%h7&}Wa<6wz4J7ZF7Q;nF<4hbzRx_~i~v5fS^V8AGOMS+Kvv8eBV(>9V zR)ugenq7V_eCY2P`EwJT4&qr{!EouLdr| zZ#=NKpf}zs2|89+So7Sc8}B?->pde_OR`OYQX|DI!WZvEF^y)nZU`qNn>pKI7)Y(O zd)2VscvVy^VUIGDtr!d!m3R<$T7IXT6UPP7>f~H0dNoWFHPHZcLDP)C$y6yvj~ldC zF6t^;x8^Rw7}FwQ4aWnHRVn4kfxT{)Fm)SD;ZL=eIL<0E1%k3VT%-#t#BQn|WD$Ef z8!>Q-nS-7N0v43&yIPgrcz}FuKyldD6!`_759@k=iWf8NH|#q6RA6HqBXd0t(j#6X{xzONmneC}}q z$~RFdpV8HQaB$A*KrU=(H9NhyCw_L)h0(7x%aJE)X@6wW05aQ~qm94AfOR#U@Q$H( zN{Q9V=lAuFiP=~p>ei!KjC=ye#S3a>37SS3n{5JZIn=>-vK`twtxPfl#grDPySE;o zgwmkS6jC;r8a0Ef7QQJ)p#rK z*2)JaR-?RLb={Jp!S@Z|cir8A3>`5)WNKJRO?Vh61f&2Vl0VgG@GuxyP#>brW#^8Y8x^S{pezt`#iW?lbR#s9qz_5Z8g@c(w!p ze>>7F|J^|&K_dnfu(VL4wrkTQQT+>XWc%2Jp)ri%d&A#eK(tB2m-<++1Zb)V=pPr? z`Q3)i06#S2ZofH#z&2@E|9Sk6C1@zHs}FG$`W0Fnpmqn-d#mhuxtqxs>X;0!-rBFF zLGUo!`90_OjSRply|k>h#-O{^5&OVT4URrA>kC%TAjm@T=?>JyM!oS!DpIm>>?L`2 z=gEsVNYdQ-ULuc1=%vlRBi1 z%dJy>`Gaee2M!$o-!u3NJ^#c`r^+2e$ecjLNp<(=^Om|h^+ zf9mbQR}?%*R?qT-us_0l{Cyuig@JgTjnXMY2Sdeqi@EY&7{^9`5!5FQk1|%Y4!GN- z`dCa5{x!XXj0OYNt8`O!sy9B_e!kGn*9bN`TH7&SMk!)xk&SlQA7A4Ybbnu4;Z*SG z=ln1++vdcd)f_3x%SwV;*g5)b2>AV|G-$kH66n6ajE!;HEb%elPZpm)Ms+=SW*zup!Ji01 zp4`{4<)vY^tv=}~6rdnm{fe{6*GWvz9CXIUGlrxg=h$u z=XW6b6#ST12&?{C06ALl@Aq|eQm0OSlYDQ#2Up&lEI98Dm~Fl5v#q(!Eu2d�WH^ zretqXXLs-x4vO|nTk%v+H+6PBBsQ)48odK@f)Su<64gqV-Ln?m9~Ws~vVUIibzXQY z5Pq6oavnJU338pdU%#4}y#7%5^{~Qe>kzY|^Ww{Y6&oP1$z{;mpIBxUEMx^7`2-%L zuWW|fnUbVA{LOjUe<9F9?AHV6^i@U}F#}v&pYN7)FgPQedqI{$fI=|vr4cM!1i#xrDw1F+_M!a$NQ%fP4{(#pn~&4~4| z+JX-Qc+siEd;GU$%z7iUenySvFLb%o;<{68*VO_>9Y^$m^fse$5GK;HYFfITr_$l+pIX3c2xLZ0jRSIZUs%p$DyZi+(7G!PXPm!o|Z<&*_Vz&x;>`bonti}J2rCJ<*Swkj=?*1u=hw`?Wij7$4)Tvn;bFtoX_iN@L zVsCgwB4)$=fd0Pws71_s;5Zd~!(l=Zn3$}-aK`^AKUnKBAjjE$KOWmy@!-I884M=~ zOTGHib3%g8P*voo4}U_vG4gmdZ<~JoNKPxPkso=YC2t$?E)w%T%i&ddqq8tGQ5m=2 z;NPFP<|i*ohhONlcNkVjJ+41IvcuN(=^Q*#we?C-`~gD&OEfDTyn9vW-TH?S z{i40Kcqv3d0QEFdFVORmz#uZz6M=q4=r1b+dk7vcR9#hM7Z@+-+Yl3)Hz@VSu#qfm zKt%AHe0Oc%jaT!t)iU_pukJ)7Y)fm|xx|uA$G{$Js|)Fx`g)vl)&u(pIa%2Hf^4py zW^RtSAE-9Zjqh_!n~b57m)N58-n^^-ijeb3@&h{WuhV~bJumh;lmc9!ttT?usKtM0 z2xN3zu3xbpRE_p@m)*si;!fgbFTRI+@1FJpA^_GpR0BC5x!T6c=OHSfd$hjsn+LMy zI@br%Do)GGtKyXK^{tp$-5r7eES`rDx?Vq5{Q5~v(tHjHlo>1@+7Quj%g~PK$ z#rF@7^l0fZQS;S@kgczGKz=Ek%6mKi*BkMgCUf@twut|oN^FzAQ~%kwj^g_v6_DLVyjwoi4T+7JPCtrAT3r+&5fI0by!SaP1NAuy{a3vG qe;vQ!Q|LfPLwy88qMPs72A?)282?pQ)=7T)_(_S$i&p+H2>c%^n?C*k diff --git a/community-resources/src/idea_community_about@2x.png b/community-resources/src/idea_community_about@2x.png index 72bc8c68a9d5b0e880c1fdd0f0e103c5f1966875..d7ed6b89aeecdbf5e3a2f1103ad2bd593bfdc98f 100644 GIT binary patch literal 214572 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�M`Np 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

0-HR70gnK{v=%Kbfa z>V}#%GROmqXGDFgFe-JRK}+ZAu4EZ=CN81#pFxJR?`TG9ubt`AIBB)+gXsXHI`pBs zuVi~2vL^tgX=*_Z5Q?D-8X7H3fhmYo5bq<`d4#HWBz~)n3mmTIg1hX!RK8XC)A|&z zn43<1lMQYwCN_LJ%8iloyjv)-L)G`O-O7K!=Pf(oTlbOo`uwTsx9U%YAFx zb_HYC2wF{cvmqvWW1j3-J9M_xdTn-u7N;Z%0CO04NR=DY?VhD6X}h#zWsHQ_izmnapqgfF%+Z&xePE9Zjw#s$=s$Eqs8>nz?11a}g6V;l*Ks*-Z2j$jMQT3&($)iMC$&74#D4*c? zK#2qai3R1M9*@M6Pqt#lN@UMbxQwv6G#tv%RP3AA4cf>qgqkxb2cZw|zje1#uU`0t zSGa)74v;J@K38p7uwikM-xa5uz7^ygb_%>9!{+Gb?_a-n?Z(58?j7BG)a~?pm-o*; zd+EYUmsjWaI6(I+4xSnarQHX=`?G7`c}@I~zWMT%uRhnf^}V-m-g)Et{dYeuuMl?H z{m(ve;fqi2KYKwV&Hzx|_`$oMym|A%wcF*-r^;J={_^=RJuN}8(lsC&L2Q`;TDx%b zw|{oyJ8zVqy!@>fFMR#EvX4D{`}X}eZanzetpRUw=D8;>eCe6Jr_VXH+L2ed^TYS= zzJ6Wb;?n;4mo7i?rDwa{9?zO&F(Cw27RmMBefyp7{Fs;V8-MH9Wd9V^Z6{%UI*ZDKgee>s@{`$)?P1UOEyMO2Z;(z+)-~MX^oId=~wY%4DJh*XhbMN5HrE{k* zoxl3k7uV-c%VrZoO^_y}`Wt^&fBpGye&Ly~zK9O0x%bYkSO3r7I)R3M_wW3A{qwo2 z7r*ph{OOx-eDvBs`fWAs{PSPA^2N_WlJ9{`WlS^#i7j8_wSV-z+i$!l1n^7ezVu)H zYO5CT<`u@GWahUlKn)s}N+G)ezyT_KHt~UHJCx9W(;847ii3~tef-7;2Or+Oe@z;I z{bw(px%$NUm#(bO?zzRwJBaR)WeYNiYku%|{vrRB-zMu2Z*1;gY}lcmFY8@JoN|*GNeC_=oR4eE0TYd7XQY z$}(GDI(O-pUJPg9YoJ&xo>t#{Dk7=NZ6K3Lr0&8d!o~~JmN;$_P0oiY9v#oY5Wr1C zs9}I*w-_bfELN46jbtqcNrs48G-HPrALY2rxwomuFf0vGq?}@qv!^L>4J2uh+_#ef z=cIAWRPyI$5jcZ@8tjW^?`r>tog5FZi1OCa{jZyOzVvR8ab^pfGBQ7cQi51fO_A{? zX7GMp)zLB;c zMvmf{N1VQTTesHhNuA)-dn_4KDj3TWLi<8*(HUCXmXZ0 z@DoouwV_G$9c9cG$L%J6VLMr4&8l`oDvwg4Auxw2%{JBYW=a6$T0`-GFFVS?l>cKg zA-$gTadpdbHmi$vu3TL6eb`PdsWL1pc>&VAn=@7qXmb?{P5k+{ncMQb@4Q&=Z>-`F?nj&_YA^mo3M`UwQv9U<`1qd-{Riu zAC`YEeBtS{0yrcHRHkcyFdNMzeme4{;!l-<)7=XzWwYs zU%C3VmjsJQ1C6z$4PLsVivS~eX0iG3A2y%@e=}cx>8ZDWb9aNcyZQQimtT3-&t_jj z+edu6ACCrBSLJ^fUV6&GP#W`U6A)lu4VnkFAh|bAhFd^tlh}L*Y{;1$NoAUn4kR)X znUD@g!+YO-{pPFJmY=qiS>>M(fA`I&zx7IXCo-Hm5XQxn(rqW`IT#1J82`hULgq<* z53G6-;0Wnd4UP9|PT_9<-cN7-o1ezTIxl}dc;|Nc=fmH8{o*e?|Ku;fq}JrfW5^r= zZf|etXxNl5^z9!G_aB{DW*@)$&Xqs)^2M({Z^DsTbnPvPp@Ek;R0Z7Y$tWt@?M}pj z652lK>6VxUqPHo6C`MsQj0(~Ru@R+l18oWb$(64#%$>8Gu&r!ST9KqQ4cibjb3cLw9{COm`2Nl8C^4vM{`T6CX-HC%og$s@hlKAobjk>e3k74sT7}cdVw6l6cF*aYVF9H3{IhZUutlLw* zS7Q2RR?UK-eVXbKGfB+Bm(|a)T#`N`mS-Wsj+yy08GT&>661^#E}uFMssJ5_zSKQ& z?8-MS<&l86lvax9y4vH)`e|3dm_=?Zc0U=u0vJNL^}fs?I&}sw*JnzR+CXV~CMn<~ z`4Ki5Wxtb9XWj>)x_MDhGXVsuJ22QbICRRJiZG?=l5Te8VV@pJP-Z9X>9jd0*y7m4({F%{e9x;L3^-?uZojYj6Mn?T&*?;Y$;Da4>Fkmkdwu-j5GFBm71v zZ|IYfWM8agI}EB@hL|WfAjoC^@Y_GW`-AKHQtNjArHkG9z47kB{WosLjT}YSzxUSN zYqzfc&7W`2oRafqfQxh!j(s%UO@8zL{lVQ=-JZdzVz%H z|NHk?UF}^ySAOh15GMMdzW%@dt1tdHzv6prY+^M+*7$LySC{qo_CI~~_7C3Ex43+E z_+);I+dq15_1NAMU%FbWtG!F-x^;VR@fJV(`~UW9|LtGs))EGS(Xd>eO|x^u9_cIH zd8KFv5Gy@tx40S)DFzz%))$+_&?V@X4(^Kl%0F;T1b|c|YuQhc_NXyGPf) z`{Sw2PyW(pIekFCIV^2TrjQStjRaJe`+srwxj*xTvc~Seee3QuodQ4qtyik&U%%6H ztG)8Y=iY+R!`*jo4)+h%=k|gypMqKd01^J^-_KR=)i1vYyUAn$^R23jR9$$|{!MFV z_57p!%%gpeja#_b14S5*kKXtPzf&F8x}E;)XD{wOd3N*3qdUL6XdQ*qT>C6HjS27_WLq*6oth@p+66)?w`FB9&;EX#4kB>vwTT4P)H(cSCK?$T(q z^l&|V0JHL`B@nl4$HxzVVNToT{I2RpFfyYvr3B~XAz`3|(QUhuVlZ22MT2i|V}7Sb z*(S0W%%T%>^8py1N_k0kQOQOK-r{2;xW!Swztp2NVnpU0Qi{|{XNuxikx2h>8XzMI zlk%;DZ)Pqg3rav3m^}-hbr5}4GB_b-+WvCBM1MeEeUO#nFma5XECme?8UYT~8WHGa zwCuH`5<>)_T=a|$AS7s32`@)P0yAfb#D>hh*4b0*nM=u1s|Q#{gAa|p+p-uiCaQiZ z#HC~8;aaZ|1Pz1#I0tOP!fFs6@!%knnnsF105(wVI%IfNBlBpDP1U_dEV_j`Cj-*b zGG{?AQr0`G3>gh;q#A{FAiZh?JqN!{imfz`or(}SXzwckM0e>ZuGbAr;b2JFnA{;6 zj#YD2w6OCQ_@p=}6}EIjfkr$zi^9UwLGlx;_Mq^w?-sK*9ndVyg#^MY)etTDCOP<- zi(M*+LF{6uscG9%O}MU=USm8)lw5RuFXW6J5V`0(2blz&!O8*EuXaG}^zryG^rwYW z>dK=&I80up@&KbH2Nf1JU5{%Mm>6BwP=s6+Sz-ul4FMDU^7BK64_OnOhJ{I25Cu|= z8``ZQe~1bS*@I+-l;3j_wGPS%VjQQ9q>;A0w0$x_>}YVp1`PINQfDE)NyYEw>vJQE zX(;7f zK69#Bg;8Ms;I(NSd`k$HJ}+u~FgBA9)unxcYxY~Ux;p>$r!Rc-SvhfGuzBGxym0q> z*KhyEPvlU!@!4c$LZETfBoL~uM?B|@pu2-mA~|g#vzMqad!}=1%h=T31AY6lGPaU(~+>{5g3ob zxoA%igWmsteq27ug_o~9`^}$|p(>7&_kR1$cfO<1dpG{|PoDU~Q?edPgD24Bpek=d zhUE$9L3b;^xZm!7?WyuiZc1fuRmGWKep-#3q*d|{Md>^3ec^KRT^(`0`__A(`IDbl zz*{s)j!*K9*Wcw2JpJY8`*lYVnbVVwuyVjMq|x+Z-xF^U4WMcP5iyHe1(P(-p^qar z{hxmK_iJ@k3dEj1(v+B*9aOpRz(`u_+iTmWa5E^QzbOlf8+I9U0weAOHY0C6^pV-SO46XZv5_B z@Bij&0HW@__s@Rx++X^Nl@I~_b6my@eDE)RT$by(7cM{bjnA*dFJAuBjo*9w{ok@1 z{d;d;{KB*Cy3gvT1&Is8p}oa=YVvH8^DK=Sk(TDG=z}C4p*jo>nGabF*fLnelnCt1 zI30Lhi9{d?{2j6eku|>UXxydNiYI)qh||dFKa6=gOf*IUZjg5- zG@TYn7aQSqy&YJ#t#6)ll+^)Dr7(_$>3hXdK! zOJ4x0av~xEy9bSM!ad7YCn{16S3{=%svg7~x#5VNP>xDb?=*fKtls3|qi9|LI`@LM zG*hI8oDpvZh>kbk?4T;9tHehBQ5-kak&x>X>|;HOls{jiZD^NU4W>cXmMVv;+rAA; z;kdCoC;i%*WGrwcDNNPoG0n_$c1Jmw04f+5DgSEYzJz4w8e+4xe@U&^I`uVzOG~0f zwA_iZ^$%%?T^PopbXy}FRIy!66M3HwzP|lRy0O0XNuT2&v$NRuyCPp;!g2Y%wiDJ7 zYi0p>5@pbFJSx=^a9YW$&t>b68`K&{*=xACaCd_^l9aM2g6|0Br;)*(hIobk6in=q zgeX6NYf?%g*(eh0XF*B9I&v!*J;=J7942%uwo2uZrG1>r9V)ey#7sdS#?ZOh)*$N%^-Mj}H)(CR0M)<1u2DJ{CjR(o=<-QJ^I)bqioW#m+9mTSh$?P&pOo9~jLD6L?%f~4F@idk7 zad7?M-WpA z%MZNv;ibRuvO*4JhYZOtEYbKD&;HG?tS|0)I@iRw{>;Vh*S_%fKiGPU&;5k1;I1_5Gh+`s%Zpk@is(pk=Wf-#w@p zn7?}FqkP}PsHqDpNaYgR9ynMxR?EbSC znF8lAb+C{}tbv>NFMQ$ZbN|WDTUM{&>rZ~=x$^e!p~foZ*Xo%{U-Nx^+v@UQ5#jbqEMcD>r*yZ;knV^u5 zN;40P=Ue>HdK0L`!~%l7(x6P`rqfMk}KP32ifzo19U2WhUw-A}#PlXjc}Ii+N%j zbPh;Dhx&^I^_!;M3-VPQy(qFxbUDpY8+S<3FmUyjS>c(D5K$yEO2sM2OhftAYL_S- z4|iXs=BaTt-VRs?qLG;Up=@DXLx!#Apq^MH2Pzh&1UY3rTOG=gbCky8csNSqIHf)e!v^wB=}98;l>AQbCRzX8 zshv_;N;uY-%8o1+^k7{`>gCQ30vZOnYF#&sM>!sisC|y6F`757F(nLb2j$PNXdCjA;XIe1>ECtw+ zq+pdr-*pYl-Y`cF4GT_TcO8Y*8ZRL)Cm@r z;VB+R^-uBiH}PQw7rJqRj7AkI(mTc=%V1DlfZQ*EE?lqQOU9?=TlaJcFw-&_Cyy$C z(-H3qnleo|K|L)T?X=(qNqT111tTzb7B5 z-MO7}f99zTJ)9+cX`_~Pp*j1Fr|Z0kO|zq)+p=)(u~XL4C?1M*>W<`#1H%TM0;_5-*_PKR&bE(IL6smzG?r8@ud zKlxm^ydGq?mzG$*&a~-Yys&(W$A9^`xaTydaTwsq93KDjQ}2IUPrmVkCCsDz85y6@1UucJp0w3y3)UT zZNLTm_`Tcv-*_5Bin6y?XMf$k%6pYxNz>>hy-JiZOAPH%>2%cVq?|xKYzR}S_bGL8bocIv`4!ISZbX1MR&+}azPV`8u|szX5-yKYDL zc75ppL5V>e^+^P)Y7=R3#&QyNRw$5<8G#_HS!(~ROm0zaM>y-qRI6J=S_#bo=1+kU zD`q&0Vi5bREIdS2yjj$D`GIe0fO{X!QkbMFH8m3r74{f5PcBVQJD<4qg zQLq7wGU{Yetk_s-e>;tEr6mL1?8robV&B3_s8Y({wZZ5`{WD>4>%4EaZlvd~N^|^Z z7NZrEqJ5~*)Dz7^oKM??#;oQmv%0TQ14+kO5_7+3OsEDE;F5ckTwQ{3tNSq;O6eM5=v$=~Efq8-l`MyEi`iwW z*(jBckk!{!3HTa*p>I$Q)UwDXtT?8w`>}K}e#~t+nl@Q5i>c}R=#OIM60TNZ7=s`c zVXxWgS9|$r6G-R8>|<(0Gx`wHfV;coRk}RiiStB8rl{IXnhUJQlw#+?lgqcZ7Yk>b`jkvsN`LA*(;A~Mm3y}N5hg-qBO*^TFV6ej&+Y5CPRzF7xKbGm2fNRnUB1N> zrzswYRzMI+(VDc+oT@MK@XlTTOb?<wnSB;m$9ErY%2H%k8MlHX5B+d6 z-9eaGIj{yv2W_;vkkm%jK}QdzvyfD23PDd&T`^u_1i0f=?~otx9W!_~P{!aK+( zWA7e&>B?%oc8h`zK!iMWXP>=z0|fu$`wtym5~&xHVqi4!6`k{-9Iz=?IscuSGn6f- zBLhL_uwzWKk1r-0@^KT$57K8P)`(tnsKFv2i&|K=NwTidWI;ikx3uxIlRMQF4*4@u zFPYmaETGplk_A82_S3PTsCZ*;`;C@VFePZR?MA}^O7@Cwrokum#h{8q} z&`%H_IsPSKS3bG|KQyD0y~zov7`jz<#0D`+h@fxFn-1Rf}S}{E}|IN?CI=} z!JNbb2G^yEOW}R!MOc-C!HoTT*Q!e-8IkxgCTpm2EjQJkr%}6oEs`oY%$2G(-uOJR z9wd%*%Z`4YSq%)mCZo-vulO-w48{b{W~m)$#nLQwaivM6!)Mvkh2^&Jd7*|+lyogA za#I|}QoeK&^$K0343dQBk7F6qmcBQYWT1Jctjn z=#3ucZiHr*KIxOVH-Y^vJL@Tij*Su&*J<3clr*vdPDv8;2ElAX46E`ibTUZk4fK^Lnw)mjc`ecMZW(;z>jp6GGX;D?C#P7)k>x(LpMD6MUyONbn5 zCY_ftjYid47cmL9%y&S!s--72ux5Df+nu@Pm>p>KeDhiPmhHORB0FUEC*@@)9b5RN z*|e&VXt<9hH*DUWhm7l|_wsNoI6wk}S*G(!!-&nWy0Tk;a`^Zl?8)5Im&Lg#^1A(A zE#icyJ24+auK%fd$kpxjgdYN3{sWxF&-V-eNV&6SXQP3^^LhWo9y~UfRhU&>p3E;p zZvkY~UE9DJF_x0LG@<+RXAsu8%{9hH509dl$~!Z-h)g-a9_upLR}`U+Q}A<`34#yw{x;0|;2W zj)PRyevy(Cv0~*HeJ?O%*TQl|>acS^fBEKjqyoPCgZD4}>I>rC9mEL!!N)hMptAeo z*$=0iV)r4deMGMUjHEOm6XZg9N9gejKJzm_|GDSLqr#q84lJRsS(061UU?9i&L_9; z%)SX%&S&&yqp(_{VjT^p9A!t|U(LEp`g;n|f~=UZ)Ja;!)N<6f^mm|CRu9U|8Qw`- zyk5>hxqA0LxLyDL>@!bz@<`E8ks-{zxGcuUp1b&tO)!Up&8hQyEeWzIEnj?n?v(hj zU}|PG$|%*g>(=M?s;FY854747ja0irewh5yG#zCKl3-rO*v!ltNRDC5!SIYubgE=h z1;{EwLQe3$7h~0wX?z1*!1*N)+03bvqc9y7Iic64eNo8j`U|Ta@=9gDjszH@?I00^ z`G9ede7?BZwClc6&R1gw3QTCGLU7bn#en@qi3Uq zj>ajNd6E-PDJMf#m^>ialRQK@cKw8)C4*{OEwO8uAW;_j0g%=$PP$z(Lu!oD0s^=K zT~J+Bm>@^OX<|{Ovugq_46&%2)Z8*D-1?@PMr#PJ-y#HMx>IG6?Agwv;f`wMBX?Je z8uNjSiXmHd%8%qUgDf=7wxL&3$$b>DTTF&oE@489v0kXTd(E8J;kLqIU@-5qn}kRr z4;u<@$wKiRFnzPv?)s=ms2^ovbpB~vb10^m<9BuTRjjo$W5hs zO_*p4FGNZT5w>*wPWjswI7%zB2BCepuA9>M==ff<-izab1wzowV!*QyMb_J4i!Y6` zkuFsa?8yJ=;q`1egCZ#LXt?{758(hqK)kV0Ms`b(P(nEnj?t)zj1Mm7P6O%zm}8t2;_;>$RLlwldW@BiE)bE| z2R&%(KOG*kQl{pCRxFu`;doX&>K=}1n>hKJLDaPbhEe@fgUsihMh}xkMCQd2=$dLS zIp3oogugJxKyj)rl9`Wn<(0 zvIt|E87!tOH?uk362O<9^XN!ZT;p_tHz+Lrtg&Y5THJMPlNX<$Q~;fHl)|EepYTKj z%%u}Nw-?#cn?(g9Tg*7j`K%&H-!h6vuRVadd`zkD5?}-WeGp2a{KTdPWl!Eu(+osC z7$2$-D9}9E%DYgWs7-|NP1xBLq^j+f6H;GfvfsdzwP!jpqIR%*rMPtW7}6%gQ53nb(0(nVB9H0e zGRwBN=94wD5iNb7#&&DzW8*Cw`oWF)vz__>7<< z0YO5dC=n)$lx*r@`a!ysiX_`*yAqY+C>6!!I954P>>n{$*BIie{5+|vY zEmxGXiZ*RpvLI4oBUseK=3 zJ`@f_U>Hb4N7S?{V69l+KNLh1MO&Jro?_KLS$OXEt+O#N1@)Tbv*74zc zy~uKPEbJY75P(=AmKKqOTlACS!oVI4YVFD?#GLPzO5}$XQ|4%ks3o-Zo{(IE{{?Um8=LG!`o_S8Q)OOPyN)3v%)j z>&uBwmb=AKsED$rOPaHckGV(9?gquThSnn;LcZiyOiVUPf!pT2c1Xk%?}v40GZfpV zZbAAMxLM-CSxX-KiUucyR6=U=$v{=+NPNL0b^!UYq(+Y0(#D^0^`bfLUw7R>FnzO0 zVMWj`xt_$J6x^9#lGrvVJZLh|6DfzFddkNed6tR>lQ$RP@{19un5V+yfE05`KMXhx z1{hB#<=F=*?l8o}+}S8L0*tVo6jkQ&ScvHrl3 zDsf}Nk~XfXn=G;}XozFuL_uwxgj`wed2qZdFT4qnbL^y%Fbq4}0BKul#VnL&vyV=o zXYEz1$5FQA8W^7b|RF(2@SKi zHP1%o35u`d?mNl2p*dVB?`Fh8s+h~IunB>)EeHPX#uIt=dr7YI;@IA`^`TBi@{YAA zhGRLZYmnb>2NQyh#%A3Cxt@TDGaX2tf+M2oIE^6183qj76ZKq)#Ss{8kJGn}`SIm) zn&x=*x*6D_jM|6WGuJG=n=vFhWC>E%TDS1FO=IuvVxWhjT|IQ=(tEDoeU_M5r_bGa z@ZDEwcW&DIUle-#<@aAFIJcsvBQy#&^jltV*cD>aEc0)NMq;c{%+~Z`TGTBQ6>Q|- zO#;t+i%Bif@Y#01nzZ)BA23Ar%do;1lQi)PSaYt5ISmel0C~9eKXYUI-&@y z0~54S7=-FZ_ru1rLt&!8K!Z&28jdHnCJ7^{OsdDz!{LBY%QVWcV!GT`$0uz@iFJOa z;;{(u0sm@rI@H6NL9{_v6Yc3Hk2IAF*ee1b#U!rA=%-b)*~A$liEu1V&o1AKjVo#8 zJZwve2Y}Qw^EwFOuC|rDbA!Y@BVirS%iGHyX4TR`6KsVm(cw;)U;1jc8wdNzix>x;Ro{hjT_qC(iYRlK$cF_gdzj0jL&G8 z(}7yZUK2wPzGO?n3sY(uF4;%L4ITk=Ebs)Oj_v8W&B;NeXhETK4Q7T8>7X!Y4-58; z@U29BGlOu%O9hHMZ0IcWPLF3~jS&}$RkLDg=H?yiz?=}=8GiUI`ox2Rp#t4QVH(kA zl#NK6NBzkTA6E-P4aTjyI~+bFFxnLhSB-+SvkWFQjx9v%#F8daFmDCYIm3%U5JVn( zoawF7Kqwqv$}q?ewjY${olED^?M&h@L$kO zh#(|l_STMt;FY|nS4|xP0WqrjoS|1Xh4RLj>NCpnJch+8wZI~2?nPn=0cEg~{bZyb&YHtQ27nE(s>ZFWsW0y0yOUnVg4(`bCPBZ zaTeym-MvT}C)_D|xMZw2!6Qln>3K6TGESXtSjIgK8yzhlNJRK+Y9jWGc%&jFGtWyx z3Iezup$}uJgSp?+S1ovAK$`wI9}%Ia+||Wn3-c_PWM8^(*yd?a?B={@6-lefeX zqs%@`-O!iA?fh+)OW;nuK=VDrle6{J4JEBBSKgDD${zWVv(Go;;LMH&kXSb2FIc>yEYH?VNAOzp>H&>!iO%Fq<+d`Y4;(rcwpnxPy$i2zjq5JcL^8$mP0 zgBz8T!bqs(RbyP$2y%2%L3`{_mP6uzn*sweqN|{B<(;~Ib0%lt9YL~XJyK=3zbV8x zt34~$Qw0It9R2Hl?-zdc*?;{hCh2pdl(A#J4S5Yd`_F&jcRu!vx_kxxj;B8Ip>O?x z5Bn)IMh*`d?b16DBVVUuM2bcx*&uz+M(5R?UnW>MrZU1u?az7*P$7x)lyCedL#RbJ zq`r?d1_&*A84#$+MR`Bw2XsNzoI5bx<>do@2sYPFUDuOyKp&FdXoXi-v(?XM4 zyf>%%D|j6Q!8G#4I02wE792M<214CrX{C9rGcWN*=9C))eWB5;NWGKrqGKD5PzRsu z-je+On9EGL%SKc)X5w*jzyT5C7|k$KQ;?9AVV_m81{Z?Dg&&1j-LI&>A{m%jQyqt;Q2Cd`PEjBUp7VzzWY1<@{tSqn68-D zNkcZwS}EkjuzBKYdnlZ7+g3WM#lcP|kDH{nt?VBc3xyI@k2}ug;V3NAK%QiHr2MSS z=6y-|z|e3#TP^q=MF@CUgKezGTdDMkow0Rm&~ovPS`_}4Rvst4dU;bs7eL}Q(G#L} zHXhH5PhY$BZ(m~9vEwhkcJX}=pS&Qvs7vp=-dsE+OweMwN8Rz>HY<8!TN1KiE=kq& zFn9axT{<34=)~-M>Zwz#XwT#d-!ANCO}bq;GWAy;xLw}oS!yrB-iH)L^o9v#=fW>v zt^RC1Oz!6|Z@$h+ooHSzS?8{doD{)RXpI;*FRS*_gr&xTE9MtT+;Y6TjFMD(blVRL6mXraD3q9Irn5H)AR zGo9K?9)+8RTM_L2DTG)`V2-1AEPBE>;GOu%9^EFK2D!W)h&vup+R}!(R*5NTwLGd= zK(r$iT)~thgb4LRHQb75l@}{chEtyRmT`z2kQ|-bM6#?C8E4?33meIDW{zgqf!Quy zPMi1>2X4!N8YgfH;x(C&NaISgEn{J(Q=#C>bRbHXH;Ohevb2ug29K9M|FK^T{c!6m zFTHW|6)DQSk07~tFRNLWCUuTRMqT2JlG1bk=F=A+zWVrg{SkGk=ZS&mIU}=lg^Uey zI>q@q@ek!aQR-tC;p9f7&`zE>2<01jLqJ0nTGm^cqcAOb9SXr1)P&f_U2u5h?=uy>o^nl^;A)#KDxmV5S$mWLCNFh(w`wMmn9&)V53w>P5Voz6DXe2W8k z1ju8p@G*D&tA)3C!~uWYCSANNxd z^jj6CHJp%PKjlcQ< zzbcJkCdUk_<(6ujyeF6slo#jWbRgaT-PhZ!04dyUd4iMpyI>sXfKS-26;WukU@=uGp>`u7^9k zA5ixwNr6ig%K9XRWbInqasC9PL2j72rgzL>y&#sJM^9bcp4}#zjfKQ)yJoX*y21oeS|nzU2JP6{+&1tu zl_2K0J`-~daC-?#E|*C<=g~hlO{njG_3ncoc!YM@er$cCVkSg7bO&ZTeWJXV5{Lm4 zE%cjuntT@4x6)~h#a_|evz4GSW51E)~GxbFHP%w@$f;QF=xlEkeYz+1jTE@TSPblkHu>!K89jW=p~WNvrs3M zu70SRtDqLh#>Ciz$Bdf2Rupd~g@yBB8*e1&wsbfRhu0z_3oMuXV`5@F-=dmAYf#+7 z`GZk7qJfcXlUFo!r-(k`h-n(Zz^Nz5r?5ozmRo2W4vYwJ`J3pguwdZCz=kU(8F|RP zkL)T$jN_mcssq}gu}ESF%YzF9moht!riWB}bsd{7aIS38@pEvsW^Ix}xuiMjY;mY@ImU%f#9OT6vnF$R+)Y95#4Fr_Fy{XHd>^?hSD`B3r{U!J##zCVKy zk4z~Se$`Mp7Fr^d+N174+DI4I`u-&U;_de2%=Gs|F3_-R48vl17&n^;8F#RxD+!&Y ze50l@tzQphYe~Gs{$Atj`Axw#eK)quK}yEN?IIR7 z6$jsGFFm+!C3<1s>ed;>cc5ABb(e;H4%6)SA{4d0N=c}CdOJvE#U3Ra0fY|LXcEY+ z-%0woUZ+=#EBHj9|K~5Qu6+2>S3mv&%hO){*mKwa{8P4-tS3C0ZPhE%x)Cjd<3BWe9Ol{SJ?2 z8%F_##kB{fSHGM54aI7#5=D#d?r+?zU!LkN88OmOVy10#m|f5vT+)o5P9g@a71OId z3|N-f`Q47Sl*+akh&Q!URI^$c31#D%kKxM3sO#y`cRs`b>-bBzuKbBd?tSSFJDeTd zxCkv8PaP64TWPCM!-C%rPV>RdkOb+m^3Fh;fBx;cVs97J;6M&~=uhQXjIld(-K9l; zmw@ca7hikmgO7)CjT|X5y@V!-Ot8m$XLo=5uFvOm{)?lxT)cGSt#{$Jdgrr$@Wj(k<7L#4i{uzsjmv}=8?8nW@2Ln0 zhn28ix)@2r?_~Okw*bhMZ~rif@N)cuu36dIc?%YrqCt_b zaQmz=knhpIX6%o|P&pFBw39hfVoKq=M$GTX!he7nz+lAkT&An2VpEHNTNxrG6lfE; zYzx%owP<0715Y+d<&!);Q=TUQL@uT23`iJ)GLMEcS-8tVi>2{eQHp>;iResbl;3Nu z^eC9Cfw8Qos1RT*4Y4szH@V5B^w0k0-zBRgeTqDsOPO06rLRT<>x{Q}$jnwx2zrSn zQn2*59(m8ZI`mSE)g&3QP0tmPTT_`fo`&_7a7RW=d9{(Ejdb~Wzc6mu9<4U1p>XF1 z^Zr8KQSHGttl7I99#4JiS7z*8YVES?H+Ss8g>l>r5wUvhGWhYt-ZLw9_&+u9(Lw-F z#`+^{_ebki4&GK_y^*LAtFVS1T;|*6_r$qix=A4MZg$YhLhc~`FL903B&G!nh>JCq z*H$e2+T8(P*l8dY2Y&<2k^*7_z53Xi{VtG~0p{vW)%yR@8IYgVi1u&rbvn14C< zmhX9#0apIOSN`>vul>N2W-bfK>*3ZXUdVqdTwd;zDk2+_{7Ku5D@8B6E;<^yH;n zRdE;a_A_5O`qqp2Ke-`?JJN2yesbqizhD2jhqJ#?9`W>>^M=O6J5IglC&HSE_E!*| zVLy~%S7*>6dw|YbaDvU~FHIL={nEYV^&<{eg15+mtWQ|2o$I%_X&zV}-ne-B0^QI% zzxJ9soL$Gh5tJiD{-We%Pc$-QGLnt$P{vX<)hQBNVa?8rhTl@ZrJ>$-EtZD^oFhhx zWxVwC!>>L=0Oj6SZr^<7i&wtq?a{#McIc6})A}L3{^^(MpygG2h+ZJ1(->1!*lSpC z?rRP1T-PqIOsWp|+Ue?{3lef#)T#Awle(-u`Ke;Ea`66#7+|gMo;~}_XCMB^yCAu5 z@>}X?Hc2+{zx&K*O0?zM-}lr5?U8}$al|3BsT#4p3&-IEW31M}DU{FX*349&n&?WW zbK;RMnN-7jsANA%XDWcMDhVA?l;)-oDMHdNe>sq&WUtV?PCy$stufXVyh$(RSb9wF zlO9sfzMi`sEb6v_?F45UL_>i2165gm@Zf+AJlA$m^0(luG?++=@iM2=lA1|?xNvJT3gC!h>m1d+sDk#{3ZGv>5#iYILsM0u- zRvG8COvF83wJWqy=_lun7;V+++}Rxe+28v6p&vmUw0uP^j^}H~n}Lh-W%`Fp+GvJEkPnge&EqX{N1e;vmh}VX)SniR10hy=;DoKjLtKdmQhZuQAm_lQxX02 zC`bDlOLTvbW;JLwf2V~&m@v?ocUDTPaNOe@z)*qdF5x8l26nU+-71Gn4=4H2YlW`v z)MF#yRPJ?^kL=@9t^nsq!N)f?Q`62;m?AAB_7gV6$(5O;mFReC!>7q3 z%}a`tZggJz7>@kht8=cjjHR2%`AFD99{;hYzxuy^etnZ@QW?T>#v|sLw{cVGdDax4jIa?hg+X` zp1)28lHd2(!8YP6q)@SG)vqMn+T^{TY_;k3@QqV$p;Qd#Rzx3MX6~ZXDe(|gM zQF_aFJwlpg>eh~7)4%@7m+pS%mF2ag%_~B^-^2~3*ZK9De8<{uYBVk~G$UOIk@0CO zv60-@3VG|7pTGV??~Vxcr1$R{Q_D^BkGt*y85&UbPks_tPc&!my?*y|bWQGl_GW(X zSO3(L&JF1B=3~L!`h_nae^&aGS3dYydaTW5dE@NTv@|E|b9s4GasS&R+mX?K8dBS4 z>}5UbUOS#uQ2w^L=K_2=Gdv7zVMUYs4D6`gCG8sEOHPhr?>BbSL;==HA`9;rLZZ?> z4l`Xsneb32LNN==l|ZPDMwomQHYtt1iUZjcb|kIZ0ADCdF=Pink2&|?z+HfCARI;- zj;(D3AkzNgt#}4=Tx&CzyM`w&R(o-620 zlM_7;M1*fHd7f4eST?(}^U+Enp_|#SNE5>1lx1x!NzA+MTeh}nFyGIfN-fBB2vtf zFpbAqL=ehce6^Iz(_`ht|-NXY%dKMA15x6#k31SRMP($ z)gejL0_ELsqdKZoUY;XyX!6oov352nOcJn(Qwgp8krUc2_bM>^4nz`i+NF?-;8nJ! z{R09+m~ph&i<<}K6=2TKO(SiFjaB3&W;*n|(gANlkGPH~lz&y_ydUT44DL|`rC z0Ct}ks6kYp1{NOfQ=@eG`Wo-bpFwjcVBb9&@rxGD65s~@>>^2OWyN$-8(R{p2Nlh;tXi?u#`kAZVm<2VeBDwYW~o#YpWS6${achc&pDp-Zsthk;8mD zPH}hcJ$vi9|MnM_*J-AC@Z{yoA9@=VR|C26Qn}j?DUKK4`<7duXv$r?@SdyfgB?$+ z;cS?T_d^s9GUk&}DaW1DmYDay)5!K^{V zcfR<4{*JT*Kl$SE=U-htd|~m(h3(glPk;Z7upRxPdFZ1zUi?44pcKRHw%=F^j-yHL zS=iJp^`W6oRNE~&x~~4gM=##J@zU`N`FV{Z?0=HE8< z$7T&eIYn|dO>^x}y))eF@4Y}={EVeezVzzF$FHp3dUW>c{d-@1z4X;CK7IWyAAbBa zoU9EeW=0|4*TD%UE=eKb8jpc;dw^{F{GhpGGu_bE=QkcUp%1YS#M<{{!9)5rnoVz@K#abdy56lLK~`BJSyC8_o~QnOAEW`(Y%<`7qhY^;$F zlEzOGDMz6lED2MIrjs}%6Sa-Pj5!qOPGCSg6E10&&QwWBPD37THHM!Unu?`n`xZNs z@zkS=1uUQN=YR5lyYs@$nn*W}E${>Qus#A1pjA z0{_yN|M90N^YxEEk!u!?=f>8Qi>d}`6}`zg4OT^Tr2t7Sr#RDY*wVty04f9>|H>^G z=5!j+N#isxM|r_9)tHdVzT>e$8ghoW65$-zJVg>xGaotUDD!7BrI`9Mg_-fftq_3A zHpiCbf+VaF{tzsHIeVR&t%M`nDY0N+=gcX=eL5ziTKGzHT7W)hnOpBFqXf6-R99Lx zBLd#3!-SPGs0e|W{HaX$L}#fNBcQL~}DU5f$x`QKG~- zOWmoN2G>q)7puvOTz@y+$~X@xfk`^oCq^0WrY5Lyfuozp?g+2gJ zwwwR-cgwY^ui@2?-njaGkKOsy*NU%IUN0@pXW8`M?+iWJ$sHSoV_PF*W`6W&>?MYP zVINt#VoZ($f=pk*@l()%C2{VS3T^T4-X z#r4!_1~sQCHkVrYW^F_%?76c@WQuN?DrM+!cRSqOeuKtyVmX~@&{7SnM=n41!{7GG z$G^hjR{Z!aqj5~_rNtwE_Fdi8!@8y-$JDMP`&P2qtQ;J2VY@!1DgHP$`7V6-^^=$H zG8oE#o_v)^W*48hy0UGvI`S3HUbU;0MSuh;Iqf+1(T0cq;=7wqef7?-zQ{j*=ebwR za~0@aG}k}$#I+B+ZMnKI_8V>%ZYb={C5QcbZx`@QfA`4rNuBo}n6Tpo3UU6I57 z^d25eE0{(e(L}=AP3+UcQ=DpsTzQXo=-mt%L9QH(;3<@lZL|#n0m;Ivv$T*r4igS* ziN26r!H)qMT*>jeDK%awLzrc->0~0VFax)+2e4$O2m>l=hg$Jy5PlJ)syy`*@uUc= z1AtTqse{x#cnSu1K5QUJA`u`@UMxhwVBG<`P#Ge+e@BZ~Bmm^*FtU0R4Q{sWa)k+m z+`7rIo2k3 zJ*P^6$dq?JwKN;ZPt!eh!kAGqKrc&7nVaj&tqcvU(fM)yuV;V$)1UddpZ6Fw4k1h$ z!x(ev#&0+yp>fma&F#$a!aP%$`c^y7^dGVHmd^Y<7U+8!I&%;0P)LXv$u{S>Z^2wLq*xbCI5As8h zlU9#jc<_Ud_?6vBdgDvsYLYuKlcE~(F}wxVtcbt9Ym{5Y`ay~jn|mNo*2P2?jbpv| zW*G@yg5y(&yIYakf}D@B@@*`Z86qh#-L-?q|MU0W{f*bop1;eaw8M8?Ts?Ah@dMYo z%ZHR{7D~4)B%*AJQ&ODSoTkzM>l@_eXsxG zizm+rj!Sk)Cc1h9F`S8P4ify4+?4L};=+5bkUZAGwJRS%8P0O`-n4Qba6-l* zApj?a?TPc>#Ohe??k=sC*A5SET)gzY zhj&D^?ZE>`8XZ7LF!dS(cm*I3t2v75>mFJ>@+04N{F|?y{efJH)#De3HlC!l>DM(r zTlZ({@q~^E-_o2bUoQ}*FaOE+^zXaz`WL@`{MFm1uiT?`e&e!V`Nj1M7vB38+xWX? z?bch&%52ju!IsObv^}cs*MV7F_LsKlbTh0Sv3p07PkDE2ws+!WX!6D3MT*tSPrwj6 z(=OYE+or}gi_~=FjOa$w_Y}XrCAqBc$UxDf#DJ$}K7*(qKH9ew-n|IkNBK>HJaK_h`?b&6I|Vk*LdI58kd zrH@W9%0)S-k)x43Kgp2Y!DO5!AQ=S{89ad2feBAcdi+ehA`CJe%9m(LVzH~ZBoIRb zSfQWHQGF#pl?}3;Jab8*pJ}I>*eWw}Y8|Tf*vZ-4Fd&hdD*^-UvuhtmDBmL`Bp zO065W+itZOHofEQSjoT|!#cVCe2|IA&!qE?X$ECmUev1GvxDWIx zDT<1z7*Z?TArwvZB_kLs;K_+|W}Bo&7f%O@G&b-+hwLkb+R14W*zL5SrvGF#kZKea z3yDP{o_v*+Sqb!I+@4fAhuNi~w*bnXi~^@KOqLLH(%U*~TR0Z=L?e#p3{XJmqvNDf zML4GuG@1+zb65~`#%1@eK6RQ#4&T$(|_0dW{Ro!jod~aGFJB=ltX`frzd*N(@=I6}3Y&3pu&Xkn#YA1^E zETqLxJ;rM5<6e;R(#-CIJj08w$QlG7hJJTyHGQ-I(~z-NiI!SRk-ax*ie}ePji}_g zb3TJU4&urui`U#MzCEa|EMS$vhyZp)+sW zNwPyt#jc|bq|xp&B6TNoo^*~YiJL|g^*B{!MD_DHjg{G1nzf?UeH@AIDLEPBU#?{f z(T8js-OpK-F_m{RElD0oJV6{Lzt9{p{1h&aqN=Eq~$L@=vd zAq4YGi4dD-U*gU$9Zc|P5`u$ipm#v6sRUkA-ii9{so^+k;`c7;2ibRY3=}<-zsq!l z0t5L|HVE)Qei11r;njqBjS(qZ{&ih`liN+#tq7S6p+!%1VOpa(xjj@+JX_4C^>`ka z^#A*Zzx4R>cGbaRb2jIyUAqwzKY|zeT%=h5C%F(7W-GRkTvEQag-tm`@6ilUKnytV zDX_{h`I0zNO|r;q!lRWhaI%TRRCIoXuLUJAI%K;MJr?UV7$-S4?8mG0Ca?Z<^qt&9 zkX8Z{(Y2UOUVxD+>|E7XH~PRb%QeJFJsDv{YtY*RbYj1&suv~fS}ECN#l+&`qTeYS zC7)NW%#9qoBRTdz9rdjzWN(qe)0eQdD^Fp+D=gOdEn`uRZUU8 z7-J72osN__NU`g>q2go&Rtym9rD?q%bgfW+d!X0M%WwUemoEIdr!}KjjDKVb);8tL zU@;00Y#Sn~7s6PnxtBaPN^mze>=eZe#2C-tL(k(tOCfI2)ooPW>AbR@*^@IQ{+JYx zqaH;v8RUe}a!!vEjv%lSw&HAb@l4N#W^%{{Mnzz^jBM?Gr=Bi0{=f#Sa z5`y>z^%bC5r)Dm@X_i_G>y)oeJ96=%XU&6CSt7sms2kz90~5ornc`v~hR|Vd4dD8! z$^x5f(zT%*mqrPHw6a98bnOl(*F)OLP0_SI8hUs(`OLdQuNu;H4%|Q#?997gvH@8Y z6(@k6=DrJxsL-ZW=*Bn5nksZzeEzU=1RX$6(d<)O*XWc(I-tNUqzH*vtFEG-rk!4+ zwh|S#%1GGN%`}eQl2CUZEjTl&SQN4_5vn2!x-^7=buF@)R5`B1ZY2E{$NPyO08%wN zg>AU~$*(cG>Mk!HeBU*Lairlxk7Jc}bD<|KRo5-!n99X6NIsb5VD&LWoYs`W_SxGEq&oTYv=ZDF7hvj|U6NT*`j~ zHXnVi?V9j)DW2JdKbnrzf@GOHX4I9}dP|bR^(F#GTRB7g;M3^hCa$+W_TxHuH&B)VJqCT) zM!3bh?vNrCY47G-BH}dM`SmYhrs)IvNZ#7QxU%*6iW@GP%}N>;n0S09CJEjWV*@I4Rg zW;L-BH+Jzwr?H_BknyV=v1e-q=Rpj`(ZfjK=gRG%p5AfUQtk#O)px7f88 zK+}+{e^tu?+^hxRDn;KuVKLGA9?O?7z&o2K?{W~uNP=cm>}#_-MxI+j)Nc~aZ_0ix7n2TMO%DmvOQp)Xf|GE^IeqvImgFQZ{<$ z5IPh6Vx)v0uEuFAz>Dx6m|>}3H2Js^=>UN|+S@Y{7|C?Qg!MXqUms|mST707!r%}* zvR`Qz^bNJ&s3(Jf`KAeAqwsP{{TaMqNEFoyafo)djME16=khh(^c!|UAyCkao4ivF zXRNu*8=yb4%jml{Z}a5xHCW2#7~3V9lZ0;9OS7?kTHm9gQ-7SlvLG!e8PP5?@Urct zZn<N><&XCe4DCiyo7n0c>PV zW{n)#s-ro=7IJ_kmSP51+Q39T7xPP0hblX%EwwEA?D(;sUM{a8+`O zp`VYoP<%?sDC5#b3j+D2sE*cSHIFMuJq9Z$~miRCE3COj= zkRcaYD;#quP~ITUzIKa(5spu{&wjlgIAwGdDzubuUtSFk)b*XP=epxn1c|ny)bv>K zrSBA=g`@{y2tKuT(KzA9vg+PL{zpDh2)J}&49yq8&2-b}0V$Z{W~{^QC-F98#}OWr zNp5D?!br@=@Q3Jb3Du1tljkB>=`}nRow|*=Fw!9!(eR;?U{yys3q$p@y?S*_hf)!{ zr^KU8K5RVaC{4@5^6PWgr?it93R4ST(W68)vWEydO29+59_^_LIG{jbrpj~_1w}Jn z-EB<4Y5)hKW*5Go-BH-Lg`|bPk%>FO^)n?rn*(d|-E;4!Zx-E~l896N&W)?{ z&FOgNtZ6srZ|zK}|FHj*furhC{Jd-^Xsk}R4il@vqvrto(Q{^|5PFALgSN7(bz=8o zW{Q?Q;a%D@%1;$cA9bFFbYP+3j+F>QjcOxo)?v0VpJP^g<`g}d@jzegoc-KOGR)`A zp_+h~9$p#qIrNpeVi6^BoWZ#A+4B>$u>~$$yLVTCb@*^s+1lpo_h0$o|OL2 zr3j`sf*|p5Q#*lnFhom=B?rAiPtt$-`yQQ?h$~8cA=8o51R2z|ZR$5BZ}=FpgnpB8 z1jQ2PT7KD4?{TF9{e13p4Q*lhwK{;X{DUSot3&ZRCYRqeHj_j%Me-V5(=j)0$zLtM z|8b)U-rM^7)spM*57=CwDg7gOe70;x;~yn z(9X1WaJb0F{r&&<3+rcZ#%&09PWfu&>o)YgXJLy94B2Xd9QN=}fl$&*sdiOLBt^#y zY6errbEz1Ub{#{s1jBd!sXIUYsR#bU_q!`AKu_i>g}s9&?VZI|%Dc9su{iwfs&6Ym zD)0b@dXcdg6APvHIXf@Nr7U(jVUR%p5fTZ$ytT0%Zc1eg%BRktj7BTtr)livX_Bw5F0&q$3=r|4)3|4;@6ZuFRyvpo z=L!?#qcC+WQZ&u7qC0X+(`k;4+cO+*c4_H?+KWZL=>MvqEEV+BJ)CF)u3ru7%e;iRfR^i%3VFW8Yi;PuKd&TRHWu+`C!E{6_Lqy zm%%psryb|U>(;k(2AG*yi_NHAaU8h$H%#gTjQ>*6Sl1maTeGz!XNe@LC{cK>3TWsd zL#_e_*m8EywByZ1a-qc^@- zO1HR?UE8l#iPUv4HuI7?>br#`ECmk3*htPTc09Crwy+FMWRb;&`}BHzB?B+(5ST3# z;MPnrBHTIbd`JEc`A6_Ui4Wejo3P0^ei-p_=wl7AU1)u@OSf$DNjs9`*=Bo|ILIN8 z=raHQfdm4*>$>}SA85_c-*sakS!Vta`KumDw~myCWGChwMdF6Oo3a)ZV0B|EGcR;& zJY?v+&;*AI8$G|Wv^fKcVK_;m^WiH<#K(623~JY@rsp1Z~32cS5A`TTdv1UspMT@aoSylwi+mK-e6_JU8S`d=)}U-r?uIv z&3f>5q~CJ4#H=01M|f05ddaHQ`)|MDC6PFLUmEv&X}-g%|c z=>b%tQhC@=Lz726Iwi=vtfNBEh8hd9HC(4Z#i7RL++Ym=*;&7Uq{c#M*B51rngYcx`3%0hV3-+_0S~OLr@@8}~e`@(aV+ zFKt;9s;vhOrDip>m3JkB+6Hq{p4t0~D5EU^zdt7PIuWT`C!z9XojjR9e|91)FoQ`Y zhp4p2!MDX{fx$G}o>@+GC_*1~(vfF{Y4T843~Grd!<3}naP%+ZnDhJK^@Cycsqb}+STiL`b9WRaUoS}S}L9Uq210_YWx8D7$A-s8qIK3&vaU}pfK*GPq zJMN7IOC$g_TdTcN)O^W;Wy_ffVjZ+kGhoBB*Aoo7Bmm3I-Wk&z`!3WNq>mH7faYzHS^Y~z7qi#!9UyhFk{ zGw^f|Yi3X|I+g*t3gz{%K=T8yGf?O&t5@aX)B{xL7ToOCJT_q0F zWDgD7_Hj#(U5`yTpOWH^BqnURs3!TIx8gJ_cI(vb9#h(eK7v%5&LWX&Q`beC;TI*i z`DSf;vc*ne?I8rVEkTTfCXNKrT5#&~uOg%RT!Q3-tLcW#S?e1j=38@W#uEajXXF9q zyQObB=X2@#pjigKygLAkh`s0oJ4$dTIORfuNtGu-UKA!W>bJxR$BuPP5yaiN zcddv~5=-EpQCGmAV>td&D;r}(FrR*#kepCt;Eak&?NRc){mKxb z!`Qpz{ICrgwWIWEq{_YBDbi{w_b*J(7|TjEjYs5pLCtCjm)W3(t5iwwO&A7pCwuY! z$v^sctd0bU*F5m&zT@H#Je{<-jN&}mfdw>h$_n=74WF8>s3aYqae=noRCk0phdXK` zivCPV{&t8XPwpzQI!`zwuTwWoexo+e{n!U?4yd9bN%xM-1I>(vYznrAlM`HZanY;{ z9iS-Iv}VBs*t^?tJe^o*B3dY|1;>ha+)b;V3oc33=2fAFu2SB*GDxM^K8G2lotwt* zAkzVFqpPRh_+~`L+E9I+J!^S5$z9!Yql!h`P4NBOmaT^^)I>t`f#o*h`fz6N~UH>NvbN z5;KQCC5hIRaiIQ{nG*UpYVzU)1b=b@H__MIkIJsgkIJG#UC$;;)~@Js5~qRZC#WupmO7Rvl-zfN-D6MIqd>zE zu2p;?{lKVHmW(RUH+|D^7mvcT-r7?Vb+=qkCZ z>g&CLHmaHw!*}NQLn{bw zkofM#u)!=vh3bxz{hGwvCUzy)cum}OLdb{E3?aX0Zqc+!mc8I()Q5uW&@ZI~7cO6Y z1MViaCXHzY`rqQL?^qf?$SjMtc*ji-K7;t=w!w8UDyM;wYiS<~GIytz6{y(jb&{9? zny@geCJH9e_me$1O6;CLt}XJ6)x5bgd~rOCWY9^2*D-~08fiw-$02{Xh%ZuFT_jg` z;>9O`Dsx7>ibR(MEtOUBEB`0mh#EhT? z7dC6_`sLzoe@yJvG_;#NfYm161wC{lJYrAO*%P}*DjY>2#*b{`_(VRrP}ak*2;j!n zIHr2~xw9oHhgMOP5V)*N_bhK@>?`S9-Ds)myp7qIVT4>P?(RAxU?^RFqP@KLS@POI?`1vGx?84xUUXc!3QwnOjL@LQbVp z;Jb6g^U??oIwOm-%0Eq=Q)*_slm>{9$7*%j!cn)XyiA+*JTL^NlPX zrVe75yyz1{wp;~bqHUb6`Cg|y&Xo-VCmf5!L+Xd}-eL1s>u@^dB)B>(hAr~S#fepR zs8<~Cr?(l(6>qB0Bnld-@<3+;u-Xkr)HtK5ebFSev8>6-m7@_M;rZ-(eFa0^T(F`a-|k+@)!Qy~mlqjh!D|0TbJV#?eJ+TN>6?Yb znQYNvzy-#NNI$9~vThtk)h|!Uct#VO25sqaBZ4=IMm!o)nMK3zGbU4qNMeJ-Q-h@n z;{yw#9>nYg6_1D}1K@5-epiy$cvGZ8rdf8`?V32&hD=#z^g<47^sv;xb^vz(XL8 zJ(%8@ayUO)VLAp)XrOT%HxSrZ4$Po-xnco*-c5$M4sb&thJB2!Ygcx$OpA`PF1yp= zWSjRh@^~OyQ2HRT2a$)`4|!YZ0%k1E_opX^?O{0UW8+7+-HpmQf>k4UnNsa4JnbxCjNfe$Z1tMmeS@w@3q@?f0DX3Uneqt?OIB%4xyuDtS;a5He`UB zS8@ik`EuURx12gaKEvO#zTveO@SJ3h6jNAWGSo17 zF9arDwr}Ek$v~2sSBTn@ZP36EY z(8?FFq8#>^YQ+%tX0o=J8fXB8Q7A0pPzhNKz52TcC)Sr>zBAIw&pmt7@etqn(#$L$ zoY#PU(I%2pd0)@{%W!hFZ<7@Ddm>TvR?SZDsObFTbk-^Zuc+HN+tn2}0W%B6K96jK zg%R-QfE7MHk8>-EP`!w{{RvDr^F~(*6rbGD^u=ZME~S{@bB? z^K>2uu_keKE8R}L(l|L%>~PKEW{*@SP_iVc*3|yI9IPZuZsr|0Zs3g~h?(3&6ywF2 zdNB=a7(kc`na#l&xqY4w%gVqbF$^l-!`wt~uKm!v+Dlz`dBr`&pfD&*1Kc_#b4SIQ z7!P>gR%znQyo#)iB^_Ky)r;@~G-4$fYpz$55BSKglO-^On;_>6=;`LcED7-v9T?QZ zv``EJUTJ0^8b&@N&=;oRoo^Nt|65qdiPfW?Zd%^QC^{}g%CFm(p5kmI3n^+Wcu!G` zWQlH7r=r1jUR=@GcZ@8o>9+)!le2;|fE5tdf|b}liR6biAS-Q%i4w0f+Ox3G^ebx9 z$Vdy8-!b(4DP-SMh)2 z-y6B1<;Wa513t!B`9<#i>~D8ZU0ZzXL#l7r`2rz~d<;;~Dcag#tAM^eB??b?E3cPP zM}bkohFPu2TwTv|t~51Q=9(vsBDGTjvE+s;XB-lqqB$y-iH-zl!AvQvX*QJc!Vs_g zKPM71wLx6{gT>C&VVXH;m!d{at%9UM`v>AUT6$L#{);6sMsa00*V`gZDtejkkdR0S z+A;1ia>{Alb1|Stb=gV9@-AwOu}-nsO1I4T^48W(h7k76#CoyrdkH{DLxrMBsMN$U z=OZe0u$ps>iZ&UavF8cJIXQOHd>9pw2jRe>5Gdy9Y^&yA ze(z-b!{;uc$q@P~G10?Xsk9)&9BDxcI(da~buXO1$_|6~+EBa_#QE8G+PR4H2BE8l zYqPIA_oh-p&=Y5^wSxIDX0^MZ(&{aP27=0@biQMSuS2PA*)pv(0^NM^$iUy5ih6bK zKMLt8%X_!fUQQBAQ|@?8<3*GW`3AupArvWqg=Bl~IG2z5M-h*+o(Gi zEJO1V5|cXHCGf{R>m*BODV0wm^@A&IC)VZ3`nAla92m>C>~n~HiP9BdI}RVhkh*3Q zw_CVPgmF8p4*GUI5@a)NhzDkQG<27Hw@&?i-`|TTy}y(1QkU$(@?w6%4x)LW?fQ7S zX-x0NHNEhu>DV)?MYW~+XUQ{8#5qlvbwZoTdoIh`_!$zHfqugYU**sOm0Q~7`H$EC z=FfF)QEp3&V1!Cu#(Wv|dNN$&Ih}Zc<}Fb9ST*TvX5<2kEOu`%^sHi35GX0V0XdPH zKtZWmZQJ%3Q(B=7nW#S=Ao$DQK;t^HB+38o^OCyt-~X%T!fN&Oqv2#dzIreJ`*`>4 z!N2-PSKsm|>3h|OpEPd7@r&}i*t{U|@XLiV$!F^MpeY-3z0bj8z(0nSLr+`*kH=n97glbCkUgg>_P37<+V`(NKu(>T1IPCMiByAwZ2NE>D+rftn` zguq;?hK2|411L7Q&Q@neP8l*9UP@LJR)pfLo0C38&=Zs>IJ$0!LYE;ceJYpSu0<35 zP1?n7GK~@!3RE>TuFcD|lDpcNDpOgz&qI>O1{)V=A%nc)Otmz}o%a)UO3LSzoVuwm znI)_pv`QE%xC))K;!M_GXM zhw5sZ$_gRr;e8&z-tHj0q(K7ZVTt?lNbP3%IqnQ|i--Qap{nGQsxJxa5qKR&SK|_S zwArpA9|(h2gW~#alop+4`m#`lA6RkX6`yozV#_E7_6oCstT01L@>&47A@#Tt4eTNn zI*bDThBPY~35~g;Igo#WEUHB%%c!(LJ6??JVJpR2x;W>^gh{s>hLEQAd6Z0UsAOO@ zr9QU-m6!Lc6+I@2bsIq=O;eD3YgfrpV`9*c9oV;>>ssxw2ITsNRLD}4+tHGtJHJ~A z29t>=`~1;((TQ&>otfmaPOvZWcG0lSKa)UV+z=8h8R-3w{mGQ2=QfFDE-X9*n01RK z+rUt056nkHzlIfaAoSw7CB?E5jvJ(uzYJv(rN+^@-;?gGH<(dUCvKqppChyKDML7W zw>%RZm2>&8|0Qv%M^+~{?I~8*ca1Y7N(9xk)QG-v1qwo4x4tTkVwuO_c=m)-s2(Mf zQDpX{+eJQ1 zN4n)F;cQqor{QcgAmTc+unX3fc7*CUA7w3mJ@+4TSH~2n)a6`w0W9Odg zonrwpoYHneGE)y)=+$gKUfx0Nx7Wy6wm1))%i1WbSa@t8ue35 z8-KuE#R?CLTn?S6|Elq)6X*990BnzUGR?Efn@s0veEl9_Wna10858z!23+-v!XF1JPl^MAM|EFG+UhT*ic3EP4HZ1g1L1{fcKHQ8-H=H4O0jKp25P-597>y z)k&W8^u94igA)ISdP6Y`w+F7#)XCm5FR=|uk5E}h|4qPRa`jzznA(vN0K(~dcF zI|e{rJTYx#b&KN|i3mNfX1HU24s#wY`V_!$k!kW!Z{{n*%EwZo%bR5GAiOq(GnqC( zj{{5NY0%bs{JdlJ6zJp&)^rlgBxRb`H(W5|HKe?3*y_RgF%FwROz-?Jkn=>( z4pv>aHeu~DAXp6If=t^e=p$BL6Y-JDm%1%Y7xvHs8KNya z6eECqCtmp*|J=W^6(Nnfu?xCtTMzRE9tiTFP>evCm4$MFLDJ+hYVB+f2JhSM9tN@Y z%3{Ej3NTWCQI5?i*@cNkG794otQ`1nncl%P`9iHANauY#-rW7kPu}aAi~q@Y9)9l= zDqUOvkXcwO4bzBZlHgT*3w5B*kL5IRw(1-+Kg}2=JJ(f8L$AB7lnqiS6(cD`(9llJ z?QCkU4O4gBieo}`6a`UYPtXbj2r+T#W)m@RBm1`r(a< z`)&o}1Pk0kSBss@qO7eP#`l`Q-vCtYGI>f!>x8HZma3-r(<3fPQ-11>X}EiF2edmt zX%1ZCF6q1qJg#VSZW0W>Dd6EvtbbGFbWY+z`J&b2cEChyTKGkGbQD4JR zWe|4yHdj1EB&{tmT#E>bZe&K2pXlc3fzpdjVGxD`&Gd#cH;)V>h>hIktt?VXU}Rr^ zeu~MvVY-REW>6)0Ds6#8BZh0*bR?yr*Le_k_bCU?w#+_iv=_kY#l}pkZf$)fHSJPS zEhIa=j7M4N%f1sv7}QZr6WXaK%5EtXIiM2kv7b5q(`MK)yt9;V%_GagY$In#YUk&Z z7qZ1Mt*!M_Xh%LdS`U9O&TQz2$pzwXq!lc>g0L`K&>kOLCkgt-qUNMN#0tK;vu5^~Y7sfipHHclqr0YrA zK{2rs(NLm}Oa{GExw|sQteV2N zwpj<2iYJ3TeD+|co(jpGO|7_t#Sc$@or#Gu74)>TrGDcH)}zm_yY# zSOhc(qg2?<7Mj+*30Y^BhQy|n3<4;(JNErvZzi4hvl3C@lus1LZ`h})ekmeQ25DTC ziFv=7I!?1uxbV&8YWwpNb^88If3E}8B$bvq&MK>v#Bk0Ja&Mz*l!E0^NK5Lvw}Y16 ztav!DlU9U#GY61!c-h~eGpC=fpw=oJb0Q3YCKPZ~X<6cSvx89hHrjGaV!&Z~w;z~e z_N!DLYwmx2mcXV=g)rY6&PyAp+ox%gfhq#?ZfeBNpMvQ}IYes&H=LUaB}QpEU2ySn z<=E7y51DK~^^Z`6!y zwfxtnYoqO!SnL&K8O;+~Oyx3)4>*qA^~0J|tZ9tpE%Hk=Bo=Ltn;H5Dls0B^=#=rG}l;JFWZM|JA?Dzl(WS`{=5LCxQ@C z2sQeGuJU{2Ru;$OG!46TC!X;!eX5=tmUb7nzE}~)^m&mDmPBft%Jtk(EYOs%!Qbo= z9aR7vW2`!Chu_;yx2!yt`RZK$i9f#l_J@7D)aOLa)OP#2N9atQAts8F!qO zxiej0LK*)E}DjO>jL#m14Q`<=j_f{L=;7g4goT~XcP01}_Ecq#R z1`QbWP~8suTU$Rx@?G>|LbeO9-w$_B@B9zXKocAMLFX>57VmoN`j?(hqqG}?_LcL0 z=2dd^(Wf5#%O98r7nLDu)C}yPSF|lig(>XSB_DSNjeDns6;1H$NeSn+eB@{eY#Y52 z;sxxx#9G~1GX-1+Vb|`CN*kQ|5^ER)aPT#3%nnvnaF}NPtLK3tDamwTy0`pnRY#@R z@BNiK4?!?@sNu1v&jyX2@37yl! zG46D;YT{8lsgji+Rwg8AT$@?X?VJxaYrHu#hi+5*wsg$)ppA{QNZ2K#V`3VsN7t9}WKc6SMO3qT5W$bAXgjzrcgAW{%lctYg zMNJRXzFD(kEE!wBP9ZHsi4WJ6Am*ke4%}CkV19?shyGmQIk*D#IH*Uu`2~$}S}3(^ zg8B+$xHpWJS@Z1eO<%0M{=g&y-ts9HihNMMnBJFS35+6(sMt)mD0edoH6AM>R22)q za#TUBL;mupNghtsa>Vxvs=b9rF}0qMhZwLuCyB5@lf{Y*fU-l-^6 z8~^2h%vCCTQhS)-lK8>0WvUgA24~8XA4UDgbihejU1sDcqqosX|9^x7X>Z8~ViVTm zvfWVfR1-49=r{S;kNr0IIFiJfbcl`VTHksy_2TGi6FPq~oD2@G2MlNcH<6PQI4Cnw zQWNEq@mor5{?}zPee_aQ7semLTj0tacs^Ke4+?S2=>eo*u8AF_^x(Ph#qnuCvfrTE z2y-5Z-C<1kU%K_iPyVt6gNo5r&ATf6r^379PSOaEb(U>1*eV!^e^$Cv+QE_}9Lo;Z zmPqRrz{>wDmrHI<70xN6u@*UojI>G@jpu#k)e08mH^9U!{^lB2?Z7OVhy`LHzU_bc zOa9_vn5+Q?C34p5XA0Kkf46q0wG-ymaA}Vh7_+VW2U9{Ypqp;x^MNWX`^XeZSWT^M z8=N$pA6JC#>O3ylt7WPM*d(mGV(84I(JEE8Zes2GXio*=j2;y4Z*Kj>$EYhc1T#mp zyljd*!m6@?HKcUYFLqb|?)UEi1>bf6QluxEf;zbf3XTo!WWrU<(VTn`A<_!c?Zl%? z^A*yt71gBgD0d7_&9e{7dsBT!_bPJcM#u$FxKm9w=ROyy);f&*%1Jz8+UeUYPG4&B zrwW$DN-^NXf}C8edFDT*4!Al2(8Y5o-n$J6zCwYnqOa*|kpZ{c8E0|Nn)%VGxI=uZ> z0ogvStGw;u{0Sx;J7p^qbF&%4y9^8C^cnVQwsXwzef61x-ic6$j(Mb#Acv#=W~)-g znV^+HjIFgM{CEoRQX0E54bluLmT`6Qm$BMxx5dszs{LYT8l4u30R+%coW~3(n?$Uq z(?pypR=v4Ve1CgPLNP}I4O(O8)9B%nn%InZ5cUY!xN?@ahRHjTw$f3_ zX1iAP)1b2W5QVj7MRJ~~c#gD%mMe$;JAKA`KmE!KV7==ne$>{<$FY#j0kEw6@=yn` zR23|*>p&i4L!Sua1&1g%eCE7mjIHS#f9A$ST>Yl+xAb8tTe``cRpYvrB7;^QDL46N z`o_F59#ftpt%4EkdLCi;;;!b1yOoN+q;1HzGa?F67kAu|r7#h5vZ<72rmde2Ml+5r z$s|LRFf8s-(9YIS9nyBMG)&dW?s)`hgMH=4ex}v(ZU#9{a*}UJ1%&7r$NYsJc;@P6D0tVC-gWSrn-6my7G7aw0-miD z_Yrj$kSSp-@6Ra$=D+pP6eleG&*>hCon=+KRzvct1sjXsieo+5z?pNp3rL_7n|;bm z3==oj<>Gm1sw?Y3#2Aat8uzrXyYFn2Gu=n<(lQ)~LrIHI8i*-2RB;+zI_U$sqH7KH z%CWYF4^Gpq9D9iCRTSI(6yvl|>1+?;d%{#;PFY|NFd44bwa|Y2D|Xvsm-VH!+a)x{Z<#;2_+itM4krtrS{L+CUN8Rl5~p-t#d}bhtsq7jKpnHXj7AV~}IE zvK$8C&dHs>{c+canz2+SbUWy3pLfMB2@G@!$%Y4l6TpI6Gbm;%;z6&?FsDav{`Q)B zry{QAVxN5M3!CR&?VrD8)?pfI9Cla!>p!`A>Y+GQHSWz%Qx(748Bh>G!;BvmXFHs& z4)v5OnH+$ydTPuYaxjoEzD!9~;x{Vbp3I7OHHLz-Lye85cGu)tGlx6VjBBV}onoC9 ztpB1~!a@+P2Q|tBg@UMdbTb9B<8EolkKg+cYOZGILqqypi!`38>p|3SJEtYjB&6z@ zN>v);H%E2)jE%WS-usX`k*ue68Udk3|4dXar+Z^GJDITv234x7p!MO!XWi-z#JOL| zX?b5BOJ^bS8sN_*UKNG>XShAXG(uH?!hD;hd!^UKi_!Y32WIMCl=$%iO33sx?F5qx z_sta763o=_iL9F0a%iu*lwgQyMT_rZs(GRk*O#gZV`)`Vdq&Sl^l8W=$B2glXv(=} z2Af-q{((6i(IiBM94FHh)=B}@#lS}_-WAUxy~u~r7AMDY&V?a#VL8{hyf@a#sP?>~ zYUqAZazq4rid{=&D2C>xFhD}6l^ha}ZIO1VL68ve1(;5|{CPE0139EJ^$hINfWC=7 zM-r5bp90e)9RJiyk9QTodi<~dFcGbMV=MMj*(n5+BEdU^O>p##_TzdWS2=Qn*!Yl| zZjqn3aTsFQ_;i-m3tD##G1VG>=vEy#^7#sG?0Aw7eG@ixq>NG>PBw}12<6+G??xNR zjgtuOj{0HF7Jgg|+tKOhQfClc{RUUM0d-($R~qJ%tdE~D&4_s0>Pq`DbBP z704wmH@2!$+{OTlX;S_7 z#&eg!EWzS*%MX8XICa9U{4P#{k%VlnRh{1`O$`oDuui~H)s|Cs_N%sArUW*PHlief zKscdIeB|)L54=8as8xinadRyxsI_a8b;QugRgHqUPcq)coeg)MI`v&I)peVfQ0aW7 zGIj#<|5eO)eK}wTW-zoDajd45BV(Y6`=I_3~aO*+Zi?;_9cjV_M?XS`=WnEo& z{ImqUNwQW-TRO+=t7(Gr2{~r-xk%5k@&UMS<9372>!i!uSzAd@cS3vRe9*}^?pkEc z3aDjClJV@}=Xjxm%~kL%OWig1ud3YS6tql!io}ln-w8TH2NP#s1LGuV@Qs`(v}lHhFHUq`a^W1aYMPlx z80G$hjh^^%P$O)jZ_)T|nuq?C8hKVCvp)gey2FcKCE;D#7N@v3!u`vg9pVH%T0!siTtPrKfM zgQ!7M%>oi49xIJ>08J+Z{p6t?Z96n}L+CI4)JL}f)?MHB^*-BW;arRIPU6BMDbYvr zm>l z+VU<)`9;*};6RdoImLDAAS-RzdPGSERzH)j1SmC7J;2#ww$&lJx^%?5`p_&M-;~ij zYGpEClQlI@R4=3~RnemcrV_%Oa;h}XIV*LVUUU9Ce$QWA*Od0Tc7@Ve*P+V;WCO4Q zldXbS%HthI+G|4)W>3FZ(1N5rIFymlsaeI`MVSA^V28wHN0~JF=c4#hEkj zr)^iquSKrN6~D*T_-U7PVhy|03?F#-;;Y|?do?@dxGfX&X4T#BKR&;E^67ALRUh?I zoZBT@=ZGe5N)>_B&ss&#tfI8NRUi~BrH;j$A4C=OZl_kazWU3PGi>PRO3G}(5S3jSm0F>>ahu$%$BRGthWyaJ zl0dz0=5n2dksJ87{%ik?TTXq;e-n=NS9hKM3%#kCbWc<~x09LZ01)LoQxT6uFeSZ3 zCA1k4dww6hgJ7(<)!OrBjr3pRme1z?RiM%~8!2xGs<3x*3Rk($&jttEm>R*OL5bK= z{~Rq^s#5ATRmrxgxs3YfsDQC$?mc_X&6qC@ z&0JPArCyCRGE;+2lSHTIB9W3Vp)vOS7y;rwhmfa=kF^bNv zmGw=AYugZ6$fFQrlWx~f&Y1A^crd#bF6D7jXkY*V0+yyEX?nobE@+8M9L$%^!kXnh zlKD@*!nM8uq~rP)75!pPR;s`kr&YpC0X3VHj&8yY6+Q#q+ezzK*(0_!=4L)c@U4!n z4l}KTjL7{VCi?>bIzoZ8FW(3wsF9FmzVj;iV3vzlPn`0?X&lXgLYECx^3wj#pWgyl zPyb)Oo()NYu6&VvINFfN%((oi?5@pG8xQ;#81$D7|7dfWlJ%Oh4K&xaC;Fp!U4Q-3 z^&_c+;`w~(a>^G>6N7NzZ_-FDrqUftGs33HdwO;CPuHrV66^1zdvyQa! z+T-V}9q`tfvl@_Tqutg%Q)bY(&2GN7|GDh$A`@f#gGI=bF3>aiCd@+wwMd*5`j(dr zluy#(oBsCT|9J=Ij2{J8z1SUdF$LW}8?xuBj(hNvZFvSynAbEX5cCuL_iKJ z1N6q_%|H639GlS3u^U^fc_qPXBz@U|h$Duj^?5~OPFSU3RB=4AGEb(nmoNOwKSEh9 zZC`(_sZ4q<$Fh6o$6gUmod9m$)@sceQO;kZqeg|0I1_=5H?Up0;HuTR{muK%HS1~r zweQ0t5Wg>`u$eNn(cs2%ok{Io{CU^20ALLp83ac>kqv z=KAi|>%@etW(bJ}Ug|gTvGw^MxhFojmo>5pd@nG)w8um%?8N!TveI)|Yqqp*!>vF2 zm1T~o00`oVU4zgHMRme#6K-sDp}#hFiZ>w+kTVTH%K=%{-JoAl+nqc?jN)G;0U z4p~bJ@mjL{=D(z(|CH6W+HZ+hF;}fBvrZOIHgc|Ou-;;IB9Gg>4DcL5f&mMGw75jwH~D1*B7SDN(|zlm`uJNz`Q`}SBftlOqL zp36Sp_bf>-pL#g#Us*JV)Bcb+ASSTo7YUCyv&sN2rcfz{C1-g|s{Ew$hHgLAcOwYt zG-ShqHGr$i9$Jt=P{>)o;rPb__CRUOE4Fs$k4j?HE_NGh{gc#*6!p ze&3&zkxJs9w#8~v^T~E(k4DVr(D%4{!R?Rx)|ZHngR3-g$=8J3Ye}g5T$XTB?lEo! zlB|ahot++dY&?7U@QwGus>2q$fm-fS+$?nc#XXeojK-^aaKP*XbhH^`F|M-ib4Hl# zvTF_o(bMO6+pE9ApIT{wwsun+gTK%68!}EL_6gFMYQ1mnUiJWo>!XSvp39;w&p5mw8Lpm`m;D zHNyiJ9{Z6uHe7?0Dh`TCRijP7rLy~hD#{OW!KQya{eyqs1nSHQZFVzcTooMK%t4Aq z(BU&TqPXahP9MJ%_tu+tpIyK4J{l^LJ|uR+`Um;i5*cyX|S$- z@#dvRD@;$E}RLyoZ)N7?vslz#M)r#oa z#P5FB{A`YFH$^ROxDLfeon0%LOjfkf*fuEv4?+nNGvtT|-KV^+B;hT)J>ljf99m>U zG;~6k@o-X%X2flweQ|fpX=aIG{FG;bMRgKTGf%dZX#1LDN8}mulp6JYc!n5q;D84? zLT9nbO&sc6E6VlbIm~;CbD=AaGpf&)01-`=1Z|I;8VZuD28=9=@Tyf}s=6=DGmhJ} zwR*|xeNMs@aenWow*l5|-~Nv-wwwKUg^WFY>QlI}IdRHg-BM17dHED*c3RG zheTz=D1K$^XWEF3GE~{*it9VJL}NraoZmb6z4slxsDGsZv~D}O|vKvhZ8n7 z!%^S%QzV>GcBYkL9n=6iF^gwvl!ov4%EQJ;?zQcLl%@(c=3Y_(SYnSvxW2(hPwD3BlZc<8@#0%yL>- zKKt=b=4arwqa)G=4Yf|(o5WVGQ7V0FRHrmj7)5)0RltAn-MLrZo%hz|&K5WuI2mWw zx^QL4IN&>AtEoJtPz@?qc=BsM`?@dsj79;F@>*n>t4Qyt)OcM6tJ((&fuFb%FK-U- z`N;6zPo_xU|E}fjkK6y_d&hHEtX>5Qm(|9aZ6hul+YN@ax`a$zFq6o7&_oqJ;;-c?pZe!7 zVYHgA!9(3LG!-Kj5)w;D%j#i>GfQGB8c9;9s^=b+b z5J0YhxFA2JM$Bshg2|GU;W-1`1#KMSi- z9zS|v|Mef5&R$u)=#GLKOcqmkHo?{ zzZLncvQXB7iB5SJT3zdjQ2Wwv*GHji3)`f|>KC(AL9*;A*OElIu#HZkz(a-%eCMND zYM0e%Vx;T5o8_2krd3qM1{&m21LM2fH^?RjpFt_DY1ajRAw1$5u%l=P`{@#Dec!0a$CQT}AO$h;gx6l{cBV))jyWDhd(We^&!6^A4TaQM6A} zwKi(0!__4a{@2ZBt@sTj8#){a;Tl}{3W}juh;md=d9AUtw~}_0Y6k8wiW!8f)D;sR zz=1<8qt7@0;LE!+*QJRRvgOeZd+TtlEhwDbVkFtOV5xXG6hO+n4mmrHmxr+IeBWOD z#kX(X__u*EWz_pqV@e76Q(D{3vS1}5!&n5!`f%I7|C%%t8mSDfCs8Tfp${iX+is|;cqBn{lYl>38Wk5R>~Ve9wBBr$EopJV&0;Jw{dlMqT;sFLM9 zLrf_waX}GXMY(i-Pe8iN2yC{Nt)5z=X-Kn{uPRRpxlplGtSUgN#z{eMe$$5QzV^8% zzTnQS9SeT$<{Voa08v1$zlE99Kor_-GBQ)${7d=&Qz6W2tI_Mi?byuINg|HAcW%dk z7&t*4!nfCIN=j-_O?RkjJk5>`zHBWq#~!$>K{+f8bmJDy%XkP8fl0O;$_LIL(>^vpfxKIB(3h{u;;!r`DuW zHPTAq1lw+@(!>^MmlRta40J;qr>1t3+TJqNm7p%Y?Sx`EHMWiB>cY3sseWbKdrVE0 zP%_W#De6SGjvkTQm54I2Z@b~;bX0n2NU37F0t8wZORiQz);MvLcazWlRiw*c1ZZ~3DAkT-2Sikq_jMRBg1ZDSno zYTjAyw-^7@VBJmO!=_D~j@I!*4`2N0w_x38T$NhJh7-#Ot<(_}Z@uav)QVe*fN14ng2o`07i`vRvw^SxAM=+7Ua_)}g#7TXX~@jlmlFF^ z`D98LiQ{Ff?W#>x(1 z*6bN(;{IS%7sp&pE>_A0bCkt*>1O-pnWKgWhf4yL&=M^TZ;4!ETM`k)Mo1bT=|p$t z)n6`r0I4WVTQZbS1(?hiJMC!PBvDzb2$El4#$T!_QbKit>ksM)e#-+Bx)Ry3@~*l0 zoH!2lefOy`T#Id0M}->yY~zIddnN z$cEfbQ76v1pIhAOPeG7FtqaM}3TzsZd36=OL|W8bK$0;MXBa0>vmRXn;@LvdiJaLr zt*;f@`08krWyC!9>`k#TZq3#tMYa_yo~2_uKTw>PD#Ye1mxNuyo}HwUwcTsVAUce& zt5mH6(dWriEx}oBf|&1`y>Ar{@PS#ClGG5xz@gNgu{!^V2_Mxvx>ou1sAMNVQpT&f zjsx~C`VmOQg_;TAi1~=rb#onY2{V6W>l}n;34l(S?i<--Kziai( z(`AGvPe6*M*4Pbu>;B}boCAocy%2w?a{rGuQ&^<^vyb)17w7-C*Otw`;0|EQa*4T; z5?PC|(PpJJzalH(dS!(2Y;bdblW)u3ue@vZyeDWbHE_8~{8G>*1PV2eWuhvv#KS+k zuM2I`RcR`>U30~~pZPmDiUh0z<>&0mA$2L>;Igvgu`&zZ@SmkdMwaqL2KPZlg)-O( zXe89T0QB8<6zaK|8m!Lmz)%0&(PT$*JQ=x=&8 zquEMUmY!6(t(Si0&Fi;4Ak5_uypCi%9je#zX}0`y@87?(ETsK&Z_D6NxjNIFX z1jilZ1mHHCn###G!}5(Qw^2ThcB;y;B5*|DtT!@8748Poku?coAd&ynq^nG5vzq-f z+{{9v@(#Vtc1Tp`Xd!!KxXMnkpeL^8*Ut7|hNZoYxj-x+i^|8hF9z6?Qz> z`_oo8EH|H0X~9&7xj4jMz*S+@d5B~pkc0}%_aSGU^}sYy^EY`^9KkvI%;*{VT21WRczYo+tW%0$7Y{A;A}r*fFb-bX?EOzfFBoLH#FH6;Ca| z2d!Frh#;a|EvO|D1y2uq@8{lLaMfmgREEN8SpW^3<^6iS8K$9A-&JVSz|}~MN6OW% zRx8?)S1VfjbF+EyQn=-K$ZfdkgoBEUQgJL7}>B?L5Tw&tu$zV&JsdDH|rZ|j49VtUE zka$aOdnMS~X4Kz2CRdO=CW5&Lb>^LrJWC@5Im#-WY+XpSyKvdeGZ+G@>$|>Srnc`< z02^50=((k}83xa_EA$6p830oWSowK|hG=P7W)3rP31tEZjLHd~lv9uWSnN>tC{<}3 zQt0WqxzNYMfzmPiK(7Cz56fj)xZ_coUH-z4{b~7bM~@x$+@Qo)rdWV-=ef$VUa!j+ z2}*A_-wG6Fa^)QaM*}mk0A!gxS}z`QZk1#2^>URXdNsViN>suu*v*p}W}~sT{@r`c zc1v1*))uqIrJ_2ZE|iF7-dMSK)^#3jHf0_ymP^3Xj`R(u$1coG&>-Y3BkTYRLh(pqWOUnw9GEpEyWmkM(gM^IQ!;#G%yB-*qu8y2cWTa2 z#UbEQdXV|V*+gl6vWPaDW-FON1{-sGxUxIFpMU*!@{emokxm29YLsnHN=^F`=ZbM~he|P)Xr~{41am zZDylmi!FB%-mA*H-`1?8bd?`aelCO0W43QJE|fPwx!#r8c1H1a@oShL6Rqg+b$;B>$g1c*njxXfeC2K zz9&T(H>CIvgr>{aKH!JLRbsUB5{gUjp@CEb0q`7jx z*Gw9N%7Y6JflR=eMn_~a{+i|Pica3OPFc**1hL@)y~b+PWZ)!!TgQjL>9-nQ-4gFe z05=gGAFWHV@*%QXn2K1~u>x6Rj6!PWkz4MeWB676khL~|yI1Z&WMG$CF*0x1?iFMo z4M+(ruN;l`M6;RE8|F<6 zuC!h+mn%K8G@yLRMyu{z^aqtF$~17?jRsTOxpmnUSmB7O@Xe1qew6<+w3MkwjgrWW@>VAp8f}=vAP>p0 zhHn(~m6ifYa3_cJ-~2nrKkupSnd_HNITKDT$_#YGMww8t2uj7EGOkoO!gytW{jN{! z{qj3|z6{ac@O^+{w9!&-TiN;>;R%iPs22vnwBk}?;QB$(q6L(X#$k`@K&xS68HGbw znptBS52)@5%4(&BG1GZ_4rl^GLMe+Hh^vqQKtr*ey6F|bL??~5s&L- z2lBzXEnTyvi-X}7ObaXD9QaOkL|AS^>#u74UdvK!CPEESvY$g6lzc5ECExZl$%JF> zYS=_g>}kzxG|4Sj-GKCU`qJ+|qFj?%~nVa-CHZ zk)1`m0Km<4E73yISR1(CI5jxMaFC$qU9xGbHf3%r&jpGKt{SnRqGxe9V!lo2dhuYR zTiwxjo#u0kqom}7xYtHo^lDK-6=JJWRDKGu$`f_htm$LtCNajRsjbG z>)>B}E}E{wKF z#5$Xmjnt`TYVp+5aT%7+f70;bN6HZ`AI*txweKZ1n|`rC#icCGXI}MX?#vC`;A=^M z=CW`|owjjmwKEbA7@fepBvQSkfg-d3uUUGK{2XN%d@aXCW2bBbAOHGa?VM`p=ukaM z*_tn#cUJ11IyIitdk4&`h*`)~qh~+1MAa;5%KM3scwf7YwcV?$e z9&3mRx_odz@Ve{v_YWw7fn4SzEs-bs(?9S<;aKnb_UMr-?TJO10NwTdczGQ!508HT zAKFFI;9=`jc*JLXLB6(f8?oP)tL@viT=AmsJN`Od6%z!1(X5QCtOlOqyvqGtA#!Q^ zqkQM%&w0Y*|LIFn%`Ow9oa6e2NM6ECCs&K%;1d@<{I7o7yfA1bpC&tL2}cTdOxx(W zYEJ}qWCe2(-M3)E((>HZ83DL$Qcnk?#F_n~$@h#2r z9)3RkzYCgQpM|JhCdCC^4&Rg$nf1gv@RsbZ}3e+8H=?l1^^rJ=# zDXytFQSfs{_y&J4-NM|9CdM^0?#IVWUS%?ttRamRQBIhCa4m*!6f z*Gh7%vvJVbwY%J~%}7SyK_RTS>~>eZx!1yk*^0?3q=n&B$EzlbOr5){78B~`7$}^^ zk(X@AJd(kT-)$MfjB{+AIMB|P9IQ0In$G1+Cs_H4YI<|xap zcZ^l{*uQ<#@cvJV*HPK4mP^m)2Gpew*XzVvKHvgY)1b0&E_=|)9xbOJZ%e%}3sG@u z4i?mMX_hh1(gt&OltUY`T*?=?`I}zSz2HgWNbih$IFS(5voAi68>cN2y0$XBdPW)p zm1+yD;#y*!T>)_*Zh@=HB`q~TJBe$4Y!3hA!|S`>Yp0nb08J45dE>MQ8m9_7QH1f! zq(Gvr6rij67%H+XV{S3s0ke0(ce_yt8?}|NP$1|3w)q%YLz8FIKSuV-A^?i<_2s1MXn6E}vDt zHCY2N3$6To+4uYFbsNMZV0QoFmC*o}3G|W%V{6A*9tS4dZU6A^-TVcg8K_WHw$}1( zvHCZcAAI=ZfAp?TzU^M=wW0UQwLOrcP#()#e-h-R=A7m=B>);rf&#U@X-Lq zGENm5yHOod0I+IHGi<_YWfdw~THm!p%+?Lbw{$6 zC?bpG_}_o}bzk|c_}Dt!a2)FCc|ioT*tH8KXy{M?_6KD*{vfmT(% zgto6?Ygyv-{9}jVA&#g1*^7>S&Yd&3sr|WNhar8CNF|L_soWiJd+Lfb)8k^ULaXxC zzGdna7iS;f$|F+!)6=y)gl9nEMCae&%G0&{$JM<_jds?$-%+#T3Ty4U3~-N5i1+KN$j`;Bs-K1NDgP5W zAMuWbkXq)^MKw%}SDV^W%R5HVtEme-AH8B_otyDR(h*EKMp$Hp6*t5-F)Z6gV!D#& z-NAL${ojo1H$HIiru*|StBddi0ZA86c>w^{Y(3D-WN33gW4{ebv+?Ucz5mi{{&QKa zbKU0WHq*!=((;ERCVzR}!bw?nbYx8{s!pT5nZ!&S5iw;)T*8`?Sv$NSVr|I5?o~+8IaZ) z)&yP|=U|rdt+~@WGcId&HfZdXccJtgd8=D7k1YbA@Rg6%Rwt7jS0ZR!n?V32ivKbr zl}0)5;6YE^tSmpF|8kV!`f%MY`sHFVvS9)(>dcz~`b-LUK;cJc3g2ae*cQ6H*g2(( zgPX-l!vSq3j+ZXe;i2#Sy^~+^%oCsUR6MH92&|EOdKwZMGm%IAlFTWui4o~>f=TpC_ z@#_aK99_8b*T3a zMI>8!-?zl3FEeF&baVdOUkhsw5brFy6ph!22eb`1oPr87AE8ev2d&gx__?>;a_U6? z^fQe%0qd|^ZU6a%#w+pIyqGRQ*aSEgn>0JNYTw_ytemJ3y$BCIBfKQFNk(m~2;046 z=krx2N+RJ4UiOiOo5(>HkTAPba&k|_TVPQ8(BP?xD$suaLc8& zGNssZEQs2i%Vr3F;(dgh9&w^??xD9M6e_Jin%_(b0Qd&2dn>LKQp%CGSn_xqV=74C zSWoC`%;VuYEc$VOEV!!7wXuM|(XsJ3okJ6IfjqYkDY$wRBm4dT_<_xP&z40No%pRF z$SSO5i-Sd=H6#&SP^qrh>`eOK!{7Bg`H?Gh2Y7F8x63L-&C&B~!6g84WfM(IcA1HV zWoH}+A8=AoY|I|BAZf0tP-|8TyCSgXYc)>HED^8lq=Boja8Ti4|LCEA{2y-pxv%0c z*B4wsEZQj(t92L)?pmL_9F~2X((2|L%blg6y$r;PA|He%tQuOhnNi3eH6+F)Y+^i# zhpb~Oc}^b@*DLmXgRQyo*|9GgO+k#&`47=Dj~N_9t#T!1s+m`0%DK)j5OE*g(2CEz z!5gtDa*4=mm1QR3-}D)GMt9Rod6&IK0x$_NYhSqscN z+C#6kD|`hE0L)*Yu3UR)F>?#xQaV6fNE14LLrag0*?NPxzxdO_ z4aYKR58JYc1m;16u%wbcog8T`3)D~`gIR1bfweXmA~bD@msQSnflh*6#(epwqckMX z)B)EZmNs#8S2>Vz2tA?c&h?J4fM>EiVw7mz_uOUXSTIJM4AZGPNX*WrThd9GX(}zJ zms6#xE!${W-eT%}C$xiTCe&r!IWj8m5I5^_82uE_?LYdz{~?MoJxt?Rb?d7-*3Q{L zs)oFNinT0n1~eu47t3uw|1)p8`Bg-EgRF06(z}qvu}c(N1X+!A#Z@2hvJzsLTcLi> zsbVJUgVIP<`r2|T@JPu!`uZTot-KyYprULfHM8n=;3|QlM?OKVsQes5E+Qibv4%BP zzIcbC)?)EU8QQL^T8F82yp`rwChH>F#~~GVY>1>&>HH7h({1x6ktCLQRb(Q3LQJE7|Mm8CNKV}y(}hU}5k%H=;pg7EdcqAS|M}kwCy()d!^{}4n%HJ4s{sVL zRXOD0XgszLN~-Y$o*Wzqyg4-xDxNlC&KhdJ6sxTY3nyvtK-pz-Mi89SG(a|kh-ysg zyvQR!j=Z#?k14CqjjJucx@H>7`8;>NU-CJqz_779u}Zuh#5K)uI)5Ea+`nql{yx)( zqGM8uG6mAb@4si3=%OaFU5Rfi%rgV5u3u?H3?(iSR36t2cV{1Y+cA=1%6f3Qx43tY0Ac!wtSU#f(vAbY88 zDbQ_HWP{oUo+dBYvpFQtz@UvQ_*MrRl{heW&fNTO&!H}XD)GGlSIchb) zPgJQ&6@jA+61JP~`bARQlZ3EOo57V|f7i`F^koD}E|Y#0-C@|1dId>Vq%oIEjCkBt zlq@>#m!Z=NZj-g4b5-C$VF&*z++kKwqK$_FTUNl@uu$W@Kl+s}YX% z_%F4XujKvTy|?+@du96Fdj0CIGq-%@bLreHvdUJ97{1Tuh7Z$P2-meH&n+QJqvwq} zvc{yL-Ls&jJaIOC;xO&dHN*;cFe>8%J9X~F-AFY5P)NW>1M;p!?RW~S4r~Nb{&5;6 zPNJX%oce&Mxnv&sY-7!cL_K(^h5|WRBn#`Z9W2Trz5C?P-D4~_L&joJrsSmBXJ1zQ zRJoa}IZpXTFjAohdT~9y@8Rynw{Q7y0^sQKp#&uf(@ls{0qSBCAWi!TYI(0jZZU2e z@fIYVwy0p9n39w`v#Ok!?>FcIH-Ji&|7bAR&4BC#=H)X|a!QYhOzCbbIU0b+O#P%d zG;TGu04~XIyHBB`-I)h$`Mf}S>OtZ(8U_(ukdRi{$1j_$pv*Ns?4fq+tcSxWeEsGJ zPTcwU>z@B4DABlmOe{6DIfBG68+#}!4IgGa>Ru}v+xgIfZkD9e!<>mqEG?hI9c*Az zS!w>};$uJYX2)l?tfxma%>l1tcxdmD@A^;Wa+fc>3Io*X2}9u|MDDjKG<>GRBl3gbs_S@pLqg{VF74m_o^pR$o`WWh&lR;aEc+aD9i}1xYdkuH z6tki_x{E*bXVbaMy+W(3#!eEETeZ3hlEOZU^;GPX;FMT(vizL->_K)B)i?K^25uLY zKL`~X5!)KxLYvc_k8^uN_qk6V?zyl3>?aIw{aD9WjINw0#tTg2p>zI6{muHkjQ} zN*gM1PviO{=hKHCz4H4Xa7s3`y#&2Kz>84{5PUZrHa4_JVb1QDHr}xzyZBE+R#q|D z@rDgJQl{;Xl+T!SsSQr@$x-)4%_d^M!OvCCXheIj?_VY8HBOx&K@Ou!#c|op*U-&j z5)ySYbw3WX!!qj@N%rbA8?>xQ?Z}lGaKerXAXBJkH9szNMLT8YDzahRU+?|)yW-hB zQNthl34+A3i%$YKrPv9tPp^!DtmHWYps-z4m7n>J!jKk+D}?jpie$XIg=_23 z-b!frC`~aCi7XMd;x`v4_yOsXG_esHY~=-JaKBdfzK(;JO%#@_idQXacuBVqZn$E(ZB_(!8TTuB=5=M6*i%O}$;`-q7T$}!4Wo`rkPNBRPltA4qYE=f`rcW_!>Gd;WsCG&fP z30V1AFDxgawK&9-iCa}Fr@J1WTg-jyG~I>kQzGx4l>|;LprwnJEX0swA;ckK%g~iJ z*r-)rs=CBxy{2ktIUGuNL$0dq(U<=60StIJz`5#ZWI0#XUdKdu_?O;x^6@wKH=Phi zTLGZe1w3%D39p8EWTAhS(2Yz56>vMT)$8?veOo>S~ z5><@n8XGaYl62=RR#1`S>B>zVv%}0D{VeTrFjL?AwRdekbiO$l@>M)M-okP|ckszq z{&xRqr%rzT^LfGP;^9PX)-_9;Tb~aHCXKZ`6X6U)<1bE``u4pHqF7$Gw=U?aEI!8i zuk}N=2*xqGDrsOQx$k|`bDF9luzu^uuKdP(sHV*oZ(|op9ZV^@K_#}_a{~)E2CAhX&-l@dGw%p-0}R#zL8p{%J)(j3H&~r zX}I;(UqNrNXj9qHHyhuD;qtJ$<@&UtLSj4^3WUn*BiFZ79$d8T@g+EJ)Bc(S+^gVL zt=P3^f!p!&=E8UX!L%01BuM(=Xaz36PNz|ee1ue(rU%A%RN@-GJIG$@r5+u3-|(-E zI&+GLrxv2-kyJK6mSJ})-ZV#ek;Q43zP0iR@3BVAnplh`0&o5bKo7KAxyA-YR_)=e z%x19yK9utQ`rbIyWZa-PXCUfcmNgOO9Ph0@mzh&iHhYu)VR&Hg!fpWq71`)87>(+3 zo_4%U_&dTFhV0#kQO1}y0t^B4%VpV(te6Va1!9wj&{gvpW6s8d3ktSy>tfX@n*(ji zGhz#^tSSeA!q!nkU=dl~h%aK#PZ`U{K-Vlp9i$bF3=nN@qS%RbP`Yp10#dvbY`g}B zqI?-$0k~W(@7lHwB@x*mm?CPkjwcm#S569EN1o9JLqo;cl9RfkHxoJ58JDP^TNt7h zO0mMYxnLGl5C-~6>bkCuPZ40p9}EuEZD0Aqn?CQECgrF1aS815=&-gbBZdytc&kxUHS5SDClI_b ztNrE6o;tku?6EJrD_pW^%Iv@!L`yOLe;^)Mtltcyk zX=PH*tpAAQ5@nTvBAqk_n*zP)v)}c-zZ{3rqQf#TK@*o!dgdG9C@2bF9meIcJ^ees ztiSO(MuL*@T#k(i3SyQP5@I1N&R+q^HrCK&;}5RiryRryHgShH!}ux)#+noJ;&}0u zudM@9O<8Pnur|Gu12ebeXootnJpBV-*tC8d#sm$qK=4jRm=f})cK!WLKx)y*xw%Fb z*6jIjbw%bfMzf}Hd%yV3;ltaS+qWzNqFPNONV`X=@=-6hq``Njr_8ji~G#>x-GC zJFziDr_Q^ty1f!V_vC7NY~3&5i7XI=Qerr~g-2~!P{y`uBjPL$VPmW8mf=`9{f(dF zPaPu@@HP1p_1E{q!6q!b>GDvX-0IB9ql<^Uq!0XPDVdPm0m?aYe;_Zma_jpRne}_W z^3Khh9zb&nd)4~rs9ev{AZANAxR?2k1+DtR4*>IAcpMco#G}Ts8tQp#>QPn8?qS9K$-4VlgRs4yT5KQN` zt^1Ow=V=}y3uLO-*TU=qu)r2Nv0AM;b%&m2W0B^v>PnxQ%U3%wpSX2Bmvc~&qT4r$ zHYe$qvK3^>ii(NP_hm{PY&Ly|*r6~(PwtRH?ItXKUUa09%7@lb_1L0=V`1QiaWKC4 zh)Kwaa1Bof3zKP>q+fmlkPT-Fg;T-O9?CLpg(6I26oIT}JSt0FAqzPO*|mYZk7AWs ztO-5e)(DmU33XizDq|8)0f}=qv)qw;#Pzyn9X&iC2^VMHNmc=AJwykl{P+4m%j+qB zQ@f4wWP$UPnSd3)Hl3H|sgl6lvb*JF&p!PH&y0bEMl{Z-qBmu8&Sz`%%r&Ai96249 zpBlTMa~Y;l?~(w&>9TW-6GnrFqfkUkiB_nrp(07M<|1Q_R3+{TkzVpJ*iC~X`B16} zu#@K+dQ-4eL9D5Dk^BhL=KPf_ufKQw)(6lWJYvfmZ`?}tRl&K)%D}+KMqo9*orEuG z0HvjF;|9`rc;fY|yKW`_D({Xz@Ah!|M8lCC9$s1GH5z=CI!C|OI`RC3XChOF07@&3Eta`Am1#r|ppN1C2k96)a0o+s=+* zF}1g!y7B9tNA-&#cE|g;;hug==2%qIX&J;1O}h+ne<%lT3Xxm&5B}im7{pTL7}Z}> zLlc*Bj3(s)3FI08YyUf5L_*W={5`j~!I9VQ@}#EWSk1w*nv{r*f{kr6OI8S){Sy3> z60h$>cE+wL@hqZt1t+G}wR@7&VNx20s2d}jJ}-F}#OmB?t=p9080dCpDt}&awWKhv0M0fG`7c9e(8q`YYG}4V}Eiv>>ZHt!wp>%-Ocuxt?E=qdpQa5m`)@m1m0*Pwl`ir zfuF3*&?u)W+h4g?sNr|?OA|jPc|*wQRWLsMJI!0h0j0PYb(4^(7 z%Uw$ymR|e0hCDE01qYL-QJ7OocwV5HJ8^GRScZ(N=9Cit74-OO!;W&6@YN{oln%-8 zI?6aVP%G_&S#Zgit9vmi|SIJ)Ml)@2@i!z*HUvxkr^+& z?cgmvoll}PI~Sk!xLdyLvzAY|$#K{z*C86sK=h#nPB6h)VJ`tF=+2L z!hMUp&1P?|~Av~F!mOqb75xRWO zUtf96dy)oe2W7QeGPe~1t&V8NcRaG%3(Y`S-8!_wu+_KdH<#hWbMNSHxxVc3*S++q z9zF+JvN~-GO{$IVoYSxLeioIc7jnPr2zd6hmYlP zs>2O=3GHDfK@W@Dtif>hFWZ^$Xwy zM~pP-ZU&-Q`DQGDieP_)+XA$Al&MgL7{PLv9B0a)Rmy61u0fu7)?e&Z9AGZa#e2I9yYpfIEM zsaEcn>%M&VyNAE}q&3=xL8hU2ajOK}FaRw2#2k+4{G{jQ4ru?R8;-yD$>G+MW!>l( zA(B%yOCCIP>9`9_LwVI*{7>(@{8tZ(;SrOUWUVW=y*x+FOE51(0a#Cc;T>%Sur7Vc z(;oftdq8HdiLoQg;$RAj4>140EzyORYREQCHM`O%6^n)$Po6|sH zbl#(ufNimyTUaTBBD1RmUyc%^QHTQ(o(E#5IcNwHrsfoni6aj2fD0v46F98*TRwMn z=jn398xIB?gSr#_xW6GX(Ba^_{={uJuFvh!b8iXIL4o2IW&HOKf8*T*safraW8!+V z5%^M$?889vX%zDm8322k8z&%ktuCaFkEJ^+9>UIKl&qkT*G#Z%-?FR{>x#l%X|rDQ zrW08H5RE?ERPGPPncK<3Ocj;_wv#_=8V~K?Q*8UWU5KS$Ha~tUX4!?+WL`3|GEVs7 zM-F?&04qN|wpbh<9c}He=0@WhCeFiEaw`=<1ZeQA3Lb}Q15a|JRNIK!9%2vy?{G0B z_hYJluN_{@%q60%`M$}>=VC3M=8{crMYzsaDbP*b%jY%EGlXcRQG*n z!Q>FE5fx$>xzpjma{)*)2Pw0Ix8Ya&V9jBLs&>SG4OZfQqV0IK?N&C`s(FBE$#!mm znI=H#0ZFgTrkGoHPyMGayZ*_KZ>Tt$rD>j$0LBa@3$={`!j&Wa!I$kIQ;6#5r?6UO zB+#)*0b3Lh2sJfyoCanbbK^L3FdU!g1iY)j0=1fv_mr^=*s^hV4C>;TkxMqjhrju^ z$OOwvV-zfz#!@4h-dAssu@b0?U1}A=?WH>$>Xh!TXz_dik^a z(#Wy4~BMDiu4bOY>$>)CB;^yo5LuapuASPtoz%0XR;dy|COddSh zE0DqG#58+xe&WYpzj8Iwm7v-1`0IR#a&x2%HX5A&7pnz1&k-eLT0QeN zE@dg@EJksfkfg{);&doqE>wL&4)2Q+T%!>TJe*p!{)W?O;$TXKv+-zi^yUW--gsYL z4{)x=g_TvY3oV{e$2|QNq}duZu?2iJR)nwzoqVKa6qa3g^L5v~_^H0{+8bBiyz%&! z#w+VfuX!g;&7Rfx2d(5DhqX7sPXPgjxkuW{bsQ;$~m@^&{@GB_;a!%HY-U9+TNW zX@!aiy9)J-1unj; zm#)%hEhxq1$ZAV9$tmj|FV!-D$cpyvszBe4S=*6a*9}FPgQ!t+n#w#=FtM2%g*nn9 zDKxZ}qOC7LtDr_1Dq;X6WhDid0A=t8O1=xh1cqhc;kUr;Z7NYAAt&qNE8Wc_CWy~Hz|G}l>opRVvY=#@ zZeZZyY(QCu40_=EidnN^#{@diF!G)gBza&^3MV(;%NuolYi;yNsY@Fk8)6W{69Eob zUfm<{Za_K4egly5np%UFqDU-rwlx)%M=@UK#c0Wn5+fHcldfX2`&OhDvkt_)_0`a- zssS?Q=cBMz>2Wv-YU*L6v03m;N0)XS2d~bn)`E=YtyQ%q4ejB%SWD6P#n@1h|qwT^t$Pl{b{_A@}6?9|n z`QlfsJEGMU0y`3;(`vj-v-`LE)>NUWR!20izS(FH$DY$CR!=x};_p21#PdFlI(jLh z`oMb+SAe1f*Uqgy31czGZf1|u_wEo0%y8Ds8W3`<=*$XA;PfPRx?(SVi{t?`b+gXV zH4^n)-nL_Jf(Zoq$RNzuE~Q%B$f!PYey=t(sk-P@LxOM^%N>ccQ(D$!Bd!pUOwQl? z{dc4E3m}Em2eX>Qk}g|#bOuBkFj-IkN9(1M%Uqyu?4RoJuFa$5FBAG>h**WMj39!fJuy^-a_ zOJoD0si97fW}2_m_tKQFR5-${2qF$+#3G@%Wo2mkusD4(^xg7~Q^Okpre%(S+x z-0J#RD$y?R`mE`+*3!4#1y~<_;Nd3C&6lWM%(BGG2F7_Z$dpYg9<&WZHb}IY7~;Uu zha(}WQVb?mLfn@6=!mYHcG-ee8#D`|X0wR;vgjetAJhqnP*P_lh0vmjUlp=dmyC%#T#|kE#i7AlQnLJbN}-9mo0TaJ6JdI z1#Gmv1s5(~h4P{%*HpzSlxl2<176_bTm42TDNC14f8y0laCQ<`^KmQo+Hh$!+zpw& zv-luq^@R(#!^SkP_vY#Zh=bftyH{Edh)1P?TbDoafUQZg#0}IW@5r(2i2E#|@b>o4R4}0H_{MN9)o-{8A zCBUbA`QFTi@CjJHCp8iKKIQdz3Ho}Ec!-9w)$a#CD zTAdTVG~;sc!`L;OY5Q}zjfx5qt0F=i!A~9h&>f4$5k(~7+^qDl7)SbO@%Ed0f6bia zowxfc3Bhp;*>P&@(uj~ddJJ3hi)bBR@~5To5P;8S#WX(`3i6p@a z1FU%}d!sGkA)b4d0;koI!0W=l(wmd5SOnxk-(zG}ACOfc3zAXKVE@ z)>GVc^4(_ifL2JWR7%TAn?qOh;5D(&3S!7CZy2nRxx;0@f?g6kP|SQChB$z3t@c(- znl7;;%sR3-Zz*`FCAx?|crhC^Zw~wDyk(LnA?;pgzVW5q?WfA8mW{YSxf=G40@89C z_sG9{!{)(9sn1d=6t)&7Y|N_f*rG|XUSAHNeE0MO6UU_$a4C^%o|Q@G`#KUl9Vgt5SpqcRQ=YP4SWt5wn%M>%-ZEmv!{hHzE- zN7BGPO8X9sFA?}i{X1&8OTLg44%z7gF~hvZO< z;@Z8x^7_38AE{%)y#*+hZ`6mA&%Qm}c)WkYjqMYz3pX4u?=+m-+kfl*>kpk99y|2v zbAj);)5n>$+p4aZ%Oq9pVdt-PUL*#CF{p%73%|go*XxPkJ>rASZ2AOvD>CHG;<1m@Q;n2nI^Ij+adQp&lhC#l+vcQs|F*^0PMO|`HC zG>7Ds*&~^`UJGPW^LEmhgqJ~*=sl-GPQO*J@)eVQD|-dBgeU}w%O85^>@U5Aob<=h zvWd!FU947EJx7Gws+WzOoTH|YnTK;wJ@4!e6BCKLxEx!4{V8Aj((CWI8Ei9ppSIa7 zDKi$_evG9*>T87jdo!(aaMEU!H#WBXOr{k z?|5mr?K(2+UQfOcu3qFghNfw%KCDh6kxEErUD$c(@xuP2Kl-O^C7~~b4Pm&12RbtP5z+A1;p)xz=g;#ijTO{Mg(P}VEhQ|2GMrYz^UWj%9 z*8TULMU;n~jnMLdw@3K}5iW5zWYjaR`AvIlW?*pZ@!csiKrGk!^#-B=Df0FjF={~J zJm>iY&!k;Z)y)ELEm;sMTJ-1@&P5bucXmvy!6#zRcU5j$V7XKI*IU2##mAoUM54;{ zB(mLq?&GDxNl0P${eO7PTU|>@iAc6U!n-UE=^j(9Yx6uvA;Qg&rm+ znds`3u7maF+Z&iI@z$J$YQuSvdd+-!L3{LnL9=-6%CQPW4QV#~WNa#1?VwKZ8Ve9L zmj)#tj1V)Um;Bx;zYisGfF#>XOxSGIm-$M}8G-w8;7d)+RoX&V{OPc1WwZ*SZJfi! zwHw$~9k&jgD!%xr3@{N1DuK~e)i9G-avn-Fx*N_$V#LZHX9YI<6;}ytrO>MtzPZni zS}cD-8<}W2_ZlZ@R-F4Np8{$G4%G*pC#yOAFD*-}3$k-}XM-VH@Yh z#5Wx=C>?b*F{%JoeIAk-f&gM>g@(1Of~Z-wmH=LD)T|+J<7!jsnhcb*cyFXD6P(s$ zEVSUWJ>M8tpMLsDul!<8aZDP_0w5wsHiYQ$szp62dK2~yfbcMg!K?R`&P)>k^G+mh zAa!PzT~>1wX1bDAc6lor4>nkA=2_(xs_;-z7&@dP z2&GEW{Xg=$cx8>KB9n7UG=-)q5K&3vL_rbGRnn9ckaRXVRctgY#sY~}IMBmz$Ctd| zmKS~oObV!&x{Qe-Ov{!GjykGr&Qu`S<>3Rb{vA?jsw0<$hc+rPak@>L4i~2ybD63m z8N9`^NdTxc#|t({EJ&L8g3Hz1^sO&(x13;Co-pkX?THqtGD>4-{xemJIracYo0zvl zkgS50F8}JghYvjhtBYVQBY@8B=nFfwN(K~&=P({pGjkK+dBr3q{F1E0>HucbHi#3a z#BwD)rPPb$yjoVOHPkO}c-Bh*u)u+>cF#Elx2wht%;_} zhe*>6l>y|98OMg^K?y*B$0jepWX5`AnIr~@B=IeH7!P8V)ifxwsVt*g&lwpX)H-so z%j&C&8b&#zB_l`MX&Y+^MhyQy#Zyfa^=_x~Fxt!S{g|K9;`Y;J8s7iCzjg55k2OTS zVkca5dT{K}JyKk=;b5e<81~%kY9nrw5gtO8WWsNl$Rd_+Y!=sMbY!RU7)hQ7iH-$4k=%JAjYGSAyJ|nJb3Qk^V5V@1;civTI&8{u!cUc%RG4#Zf-AY0#k9 zc8H$?3QzMgo$*1~XlHcAr>nrl8^V!Vy+Cyhzr~CsXAx#IeH*2bh`Oj4nR+amlC?)r z%(1H^coKNr_?i+!RPILG&GE)~xHzKWKJb~x^XOP=_nFsd5leDzqvxB3XVmJsf)DIB61nbD zMHq>1c(v2a*_jB@sy0QZKbGl$@)bNUG=fRw+q~I8JVD2yO9#iEaBA_m<1OVW=0ME; z+>wR3Ys)iCzWjONy1og0a!cPYT)*^-h3|XUl`mQTTZUTeTJHLBmQi`gltDz`pxpWv z7mKIBz{WceDxAXJ{&m;>$C#cEalI&pq$;FZp1P~zF-dA8z62_cBnQw`Ry@`xY% z$V20LbN!P}m%q5obD^9oD7h_@zgt26kNtT!828JAz5n7CQK{^8pn=sx|_>h@FRO3HC9Pbn;e zvgmS}I2T-+ZvtbmK=M|OIZl<%Jmg3J&p*wN?3eqCBgdr05wK+p7fKDKtaw`0b{de1 zsV5Z{?GKXEL>b!U-FQb%+BDDGtx2rySaPXqC>TUmep!+9Jrf`B1nOu}yye)j)h&12 z;P+=IcX0^uF6g!aI~i>O5_IP-6fz8ZPS@HP;0v z92T-ZX{wR1g9RH7B|edp%T!%SVwRcuX(7g#j?rx-I17%EquVCeA1Ubp9Zb zr^&j0LUD>l+|k5xVxi4+X0lDoNJ@!{Axx&nJFC{|P?v`DtR9!CMgl`fbqhmDqdsAW z%Ky_ zf>z4HLg0+Q2JVq+ctkj|y{wp!Mcn_bN30Y*A?Tn)&+?hfHX`Es-Q*=$y^{Gomze>V z8Q~GJ473a|QIe8IQGaUGkcn#kd>@c$DAZttb91hnQ#iH5O3WREqhT=sX2R94qmQm zOo)sZ9e;JS$D_k4)PW7dPnCG*}pm9osWWtX>dS7WIpq>#*krb2>sb zi?V+`q=Kz{5eL3DVv4}T;c2Z@6Eh}tU=(~zWDu^}|h%;>qe zLSCa}k-+py*d<^a?Hw|(CEw!VKl?zLiEy!TobF{@*inh(E%#VyIv~b?aez!Qc)?Vy z-WHVBAp0x|qIOO|r2WHh{a~5wcYOYHDe8A%Z}X}N_n{y8y>WjHpSff;PM9xNN$plZ z%@q?g>x<1q&1Aw@NeU3)VMueJ%-DnVdc`6hl-M!LaP#+m;qCs*4&1YD?Ur#|k6{y< zpafkS3v7kR!BFDV3L9IAlBA&Q^+(Q~`^C2~>w{3f;~SeQW1zW-$YJUu!#<<{2fo`T zYjcptf~bJT*T~x$lTd~K0PE_S@wuZs&60^C%b=4uPBKM;DU7T5$Hu8ZX+z6$ve1_s zhbADv6OV=#JAL9p=%|x_I69J}s;d1%m1oT9knEhvi(P%X0xuYQ;f^txRI~F;${}A( zTJ?rT<=L!Zi|}TRNv5@Ws%Ejvz>$vEh+um|q(U4As+3Ku6@sU-lAYS1^GX-b{`y*Fu3j$bZ;XK zDdD(idDCgon{ZwE=XPf?k{V#vYW?+^-eY_tY;x$Ywd^C0Krfp%LH(W) z)nfXF#*TW(N2n&)tduif2B`Y^sGUTqAP1$b0Gwb>*0hySY*v+WxH@*sWJG!mV!b=6 zHqhwFcFU4o16PtVufA5YPF31>K)sDW02T7633QT`gdVQ?Z*2`utV)&m)NAWy&%=y2?deSB4k~2BfYfu;AxLddmW8rX@N1^^(GHzov?-O_r__3_ zuv!niZGu!3qbey{N4TBo*fzl_&H-7Q;3yRbZm)xjjn{x$)Y+hhdU~M&r5OEDWNp27Q|K!Y-pqaSQ zfUIEcTuEB1<6)l>APvL?-%B}hc_st!h2=QyfBZa1qSnYp=#bI-aF~IKPZ?Je-)&m6 zQv$sjhr_FtgJdbCJXB(YY?0?_>9VJiq*fV@n`6OZzfD@`igK`SW{Wt`wEt z6RY5IW>OZMgKi?~m{J z*r~63p)aUuYC_*a^uUw61K6bmI@*!O@~&LLf^~_z_y_Obf5!u>et|s8azobZb>Opv zNP<|5>KKMHwNyaZ#7Cn!2-tdmux7x|afN)GR+W27Al_)fPmIe!-`r-ti{{KXsz00I zl$SyY(|giLps+HCnE_TN%iJVU&C6xt0uR3@J6CWe)Argnw6!3hZv3M@j+X_cW-Fgy z1WTsYZPg(gTO^rYR94j z%P5WV5W{k89w5##|2HP3aG5tf|8-)1m~&M_+RE%;7oi~nmJ+I8IJx2+EPIul2x!Tl zbTyQMzk+epu9%VLF^q!lK)~tJA!2kjsSeR;SH-Dn6o=zR8)Wz*S?Rrv#+Kn>Wo=Bz z8Cuy$&bC{vA%T)r&re&la)r9&C%nVK>xilJ&J-nL(xXVuG9|Q~E7H_ven8w%kX2u#LzMWz^+PUAE(VTH=^`)TPbvR@umsIB9_ldK0<7?dz0f z``l$Y_CaY(g^xuhciozLflL zV0~qH*Z{U)w6{W)%Y;Zedfn`PVqHQbx(UOQb9kq0uq>&~4cZ@~*q7WC$-uw?x-2I$ zNMhPafrL7JZk=;!Q%PX7mqGv@v@(HqByL*eBG%y1fKwbbN~Jut`(FQ!>unqnhGtlZ2RJ~mQEJHu!$QQoVLT;b^6 zW=bs;Cz8^qpwo#?l7L;E#c2v|>OT?J2nB+sXr8DriZ?yp5GuOlS$ z5`nu7C=jZ~1yXT=t9w;23@Nob%xq}MtgI+;QX=B>1mTI`uRL~XSRW0aytICJ@95m# z=Io`c6u_izz`$gdxF8%X6+xRlhbbPYBE>5w5IKqh<<2iwt7#x-)Si7nMn1qeW}Zw+ zaKt1{@N17_!&~R@;Dtwi>Yg*-_IU@Nc=Y(KH&CgYO{d6Acjn}!5RK;6OcxH$-Tn6A z>>iVmGSJ&Nl~D~xaUx+$q#mldHHWx@AdPCeXF8W=g{7wUS`(>64TGean2?1PjEO&w zUTqF$#n27!%VytTDFUwgxEWxTX}Zo-8D8`Y-U|srv5=6eK88605MG=LKg;)S(hrH*B6^hf8A{lyekQlIih`T+-w2Z`7+2vsg0y!%j@LwzM2W zBq+INV1=tNjZc2uh+#t)AlgPL+k6(Ew8P$1w(I~#Fug=KWOkye2ky+nRo4@`nUg}O zEG6}stx~Dw9gl!$iVwaX96Her6oR>yoq}>)=4qpAmYt!Y$QA5@<^}Fmb;366i>xko zkxFbZC;>ibqlC&t2Z9D+8bP|QQdsdpKtWEbm@>~Xe64?l)j?@kGFSnvOo~{W^|hg` z4JI7AX#(ZvZdaq~%c=+6m}3+AeO6<$i5j-6s%%Ixcr6fOas@`KkZ~kE$o9M^p%UN_ zcGPtog%ZpRcIJuWsD#DTyr3$+e?#(E7scXQ>cQsmfisVEmccgT8m(mtWwp`bbPB>) zKw43i`KVW+LJ0y;tmMO3N61B1r8-%Y0F39}s8}RaM0@a0@dOK?WZeKwI+8=ez7C8= z?w;hz8DA_1gQ&xz8r9g`Zyvw^`wmo z&?nxaaPS2p#89+s#93Izd=PYnBz8J5V@Jz=%r<4GZyxG-w(6x7h1_5D^p)$@u$6K^ z3UnB{0R1_L_sp*e)^|7GvZo-DhrGrzO<4$WU+f6~5&i@GV2308;FddD?U2~5iKIx16v06N2Y>(p2m>+CGYUWfRh60d z-gA!kTHjjh?3+~u0-!nsGQOV>R901H-szmZzrBWU!2uTDk`R{&NiJ6_IJ9B8M;DdU z0hk3bsv6q8k{Z_oKBfBJXt`@*Nsc;|)Xp{xnt z^IHuPYFUl);Z{FD`$$+x{;@R!g{W3n0~G6Bjd{{oXj?nek5dB#D*fdHoT+C7s@6RP z0&}eF15;yE&QKQ~td-Y9SLR@6h7oCO*z}^}Wwc&qyU@kzQ~Ma_?WXJuVH^k_rsZ-2 zCw9-UOH>tAQ2wN{b^;|oAdOWMU(7scJhtkGyb)bENjve=c7Ol>`Ss|z5u?7Q*}o}v z>PL{8M>K%bnqw|LyCWm!7l#cdnjYw1rX+kx80U7Dv%?$XJexqr>uv=MH`SmgNh_ z8hz8$5>RqwdS+;2C~a@U(lg@mZN%)?%RgF;sEuadXv0Gr@4Jf1uk5>0-PUafl02>r zS@8psEpcn64ymq=hc=x~!d3N!y`k=PKJ>#R45M<>-ct*pjq6>$Jq}fEZlhM+YO}m1 z!^|FCLM0pWHJK1hs>odp$HB!86f-;*!3v?J;u{EomtXPUGrvXX8A@ zXdc1CLC-E$N!6Maf~J}M-I=D0jT(fE`4XPJ3;}uy>F4$>}${GRUDzTy9QINHWsVsy##^FRSVe zgzh|iYKcGJ;Bm%kt9COS(0h*(!Rx`D2?xAyDKr*7tZePy*s75-o6?1P1z;pzI4owwIT*jwCGX&3<|eN7>586XS#+-1}zIp^Wh&lWA@rFXnHFf^3EXi*0q)S`{=HT7EjXua$Z|s;D)aWATv5|y+YQG zWPT4KU4kO)$x{kxdcS&?8oeGPJyCT+K-QQ(^LSp;4xV8|1zYOXQngcs1T$!O@t5r` z%$9Y{Sq<>?@^_=NvI@1b#@wXI%TbzEedt#1*kUCg z-ZNnvtNz-uz%IOj8Z|9tz1=>#4Ik<9B#*&bxfyrMjhyq5qeo`5IXs*2=5K9nA*qdD zGMAi^{83AvHP!ym3y=NpUz68|qrmB$|7E7`IlI6uc{GtpAZOFaeQ-j|VQ&l1|;Cchcqz4o{Ochj< z5o;5LTyD9da|b5RT0I+7uF+8qaJ&(ZZ4&Y+PLYYlnA-@(B-Mt|aNfmeDsyxl!ipK4 ze258QDZ-Av)JtToBp|O9@#yuGPhdm_)49eBUFyjvsH~dRe_!=jYDjK5Yub<(;uAPd zhB{*2I!@JpVw|sm`o@w|ZG`1ij^rlpRC%u!K3mjuv4wx5=*k=2%{o@S#jQ%Zv1*<* zbyW=njY0|>UeOGURwKj_=U((`g)f7afXMk{?)A&sE!B47I_*Vmldqavy-O98w-DoL zFBZEh*Ki#o7|?3?Jt2XWn`UhepkJANG=I7Gf$c*vHy34RhSP8v?L2GjeYwgHRe5oY_? zDXOtj+{UYLa4@x+eGjq@KCY*&w96RR#+m`T`V+3(H;D01ZCV(|S-lfQ`iS6Y!(UfM zZAzv!L3KggXx~lB;R{n$ELA?1O*Vr{_uC8SYt5V3an^J3Eq>N>H+Y69t4j647YkiK zITF{#wz`OASXVb1HrDF5#&jF{rx5B6;i6}Zwkl(ay0HifwmP5AG(?m9l-1AG(FYe!`Bo1{d(EU;l#B4~vO0yUy@HjB?R{m*ga}(40#%zW`a+r6+@bVF?vYcKP%W10IlN%cE~;A0pQI zrKU>DZ`t12fjuE+;E17j*KKRYFsj@v@_YPXOn39i%_NnEDuZuM0_)Rtqkk?+OTC3< z&Bzef`&d~R`c&;9PJnBsfUs$J@~P)gtU7uPIQBDbqt%0sMX;?#SeNPEH1Ty28$AKl z{J!X>o~k8M6J8Hf{A1{`yy_VP^?DjS)}2gxZQSNWwb^Q{_P?bHPRS0YQE&b ze%%hHs;p;dZ1nbf9qKhkTfPNg^eq~F5+{1Fb5$&_Z4N1X^KEPbdO62+eXkFu8Q?Zn zjWNpYV<@cW^(r$%%a?WjC^)O(d=EzeI2O1ihj{_OF(E#+UUR+@*|MgAazA)S0_2Dr zaaeH0qi7Ze$9rWFlr+WI+*?S~H&a$cldWxBcvbb_v~v^yF|egE*Lx|_^D*CyV7X4?QIgY(~}t7P~|sh&O(Yg zR9SZZiKjGmh>hOcY>R+Juw<23d7vde3r*RK`a^cFX7@t$8urc{Ox&aZB`>2sE=l9bk*nW>D0}@bdC8TU#`2Q1N#05cy$=R^XQXd52Arb1 zu-q(z+h@c#4@2MhAWlt-ODsNN@hK}$XFuDo%5hO@iu4TZW+iSmX4WcLBGl|4q*3-r zHWr*{iA~dsHEV1squkzE?d+a@`Nd*%sVYi*?X{p>JfF*x>1JAhBAFmvVRX&Xpx&5F zO==mMybTEl1`Rl*UQM(5p)KoNQG1g67<9;&&cqxgE+t;mA|v{QP_-6>jUvVd_p;W| zQu%JlOP1duU25epEK|J2R(VzKx}i-)Y020k@ko{TcOl=gDA#WJVt2XN+1@EnaVfRw z%O`KT>w&-i{-f9Z}nfbn0hSLSLo$eUhZ%udts22&yS5fmfn>}qM?sr zsL~xcAg$bgxYb#@8|rC{i@&_AqTYKPWp$e`7@F6@Q2G$DOCvq|%EMeX8)(})^&y4`Sz3)yNOF?tnwy|PbUl(9&f zLrJ4;<7?sxVn%L^oSJ&j2i6?_B12k8JQB7w8k>b@T8IQ+wXm^flMRzQ18%M;ao&Ia zC3|cdcVvnlGy?5*>9wW*ydnWv37`h%(P~J+%}c9eH28GF=RszQX;;S&kn%>$*n%a{8oRel2L=@LCfn| zs*Txn1T^y`dl&j@mUD`MgPzn2C(@`egBfOn8ldU2vC;%HS@t_bo)NnJ(IVtQR&n^z z;6}3BK_-Ri6gi}s27K-khVkk>FV0=XY>;SxkU*Wbmm*pa_BqoO3LNphLS^Qq$6>)x z{&%HT-PylQKj_>{tB?*LDi?Z}Y<>VzTD_e%n`yNARH0>`j>bt4M;w}I6mjcj-;?M^ ziEFs>&Sv;%mYBzdqnezARWu{Erw()0H-lwFBOhotv!a4kFWzBVM66Fl`-F6{khW{p z5K;oGf0^g=XK#Dp+^a7=<@~c{S8cTqM(VwWW{J+_Wkz?OJG}cO^#+XwI_qYrTC2up z@Gdj+P3T*lr#*^?z8~tWoH=3L9^HoBXF{jwFwodWyOcIY-FULBapDv+7IihqN3w*G zvQ!tyQ~*f`%BR{dcacwQH`^mG9Dd?&Z`pqMIXGK3UQLC8B1lY^_hf5pt32?wM);6f zi}~fK10FOfv7zIKQJ|SM1SP>6%vXUki(U}8wLAS^jNWQ|%z)@2Nk{a%+E*wx8I7dy zw)XEw(}@jnZ*5Rd+{oqYO&?&tp#xRBt*yoOHhl78fauI9%vbYz7J+8&dOl+Gvl zE{Y)A+_Xv?b+=Xxv>Lr{q5Sgg?VWNN%;wS@(~h{JI^-gk`Z4X>+A8l`?@jkRZitVA zM9d#+U0sDfF?~@*n<}T$q>XNVYd2}yoa#x4ULfCl-Ib1X?#&HHN1IGT%ybQGD%a>J zY2Q->cKqO-y%DUZpFV^j6AD^KH)_P@ZD%jNSFz=%Dv{Y}K*T2;X+?#0yQKAi`Q%>} z+mg48MWWDK^rnbH6?XF2i64V|oNq9DJh$dYn%ks^igbzlNRUVe-SRR$blt&@br*o)a4sqorrSbm#A>W zZ4`%(=mkrar$$|)=8=*yWTFR&EFq&;x5fGKt4wA3uazK8?ojU|>k-uI`fI`GTRza4 z_h#ZFw9?mjZk8n((UBLf7*HWeqsw;u(jOdrh~ZduHdz^v|4w-=-ZwD7BNUMp>7i}H zeK*R6vOkSZD^IfrLS`D3>0K_{&Eho^;r2sckf7u$j;< zIt~^}(el)YUCE83c1>12>3-AJLJuns1Q)gE)P~gRbBHykscJ@X4VZThT7!K|ulbN^ z&?vhvE3V8=<)+OQNe!N?zHhBZ)-80~W~(KK)v$Lbr7-W+hMt*Bifyf!*GhNwBJcE_ zw~0f##j2HrT|A?;>y}?GSwX!cVL{VOE&x?&rrlF|09N0P8Eh5(5ys>PT4;+RM6#A= zm2ZCj&WA6$<~`$L<#UJ!asJVYDjl>qO6+;m5yawwDf5-({YO4k%w<%sXpKeItFqi* z`bMZ{D5DtCwhOSVGZ&heiA>nl(H{oT7S9BI>3PXdv*(zAYO^oR)JII+~F9(o9U z56BGemfcVfmAIl-av0actzI5Q+#J}qZ`3c~*u2o)6Qx?{sxE>|GK1r|y}O%b9L09| zhJ)vxxqI~3pfR(J*=$qY6L$6c%O4lJyJ*+2Z5$>$S}um0T52Q)b>h%xxT+>B)$Vk0 zk}Ti9TrKu(Zh0O4fVC)hsINe0x2^VwFw8gRy(ht@p?>m4EfIFgdT!}d|CPT#u(c&; z>`Glhl8)81E4%wN*<$N3vNRA9v3}M=;XHJgJ&|I^o-tbWe5z8)p0m(buhKWVq#I8t z)osFcA0kY9QZ~oFh+w(Edh$74M3y=-Dqe}V#i_$P8k)>ETm_?t{HGDEI6;n8l|zJK z@RzZ6dv(j`U65Ev(cIU^wyGCNi_$LrCANkQL+|^XEz`QVr+Ub3ZajiFM#272wWl;O zsX!jLo9pj3hd_L@jx5zl3SO3E(S9t!mTnv;4_sYsF`OtG+3=}I6m78UGX}+slf!!( zTfVyMPQy5J;|`-$(|BwNa<##Yx3W05v#)oON0(`IA%wcBhl)(W&YV*<_hZU5Rkj+) zV1|lK{;RWeKlM#z%^zA2-)2=izHeDXZA#BhgK4AST9?-3Eg-h>OQEnzRb0@?-4p7m z0QQnKY2JGAdnK+W#|?kE@^YlIRqrqi2hfJ@1SL1DSy0$TlF;6fnkghU^ik-8rta1! zUWZLu@@c-doQ0_MoIVV?&{U5#*SZKXa>`o-M(_E+ud-~NSGHQurf$;6MnTu=;aGwN zQn;q+#pz6=*6MIPM|cTW9ZDh^&EIvN8Ch!Gu2~qM$HLRo*23xLy4g$3lFv~XJywV7 zVQM|rbq+U<f-pq)*5}#4|)RG$UH?EmblA_kE zWBExLhoZl8b8AZ`kq@ir9`Er}`l^#v4p@WE2>a700@EXb8|zO+Z@s4o;@FH!YlXz( zXuc9q`Q^JG{r*23JnPIe&N-`V+PMnGd7jUjc9!Hbo3|UC1c-|45n)~~vJMuLD&&g@ zvNSZ3GCndkS?su*_CnK+8b-y$=_F4}vyGBC(`{4TA6gw6BaI+QBFSL{KcYfq#Ow|k zFgj?^csZ75HIv5@1vl=Fhwpy!{{QsNXRg0vwF?V%(X~sovuZwav06rp-%P_ojjNUz zbTN2h+FQ>|aL55&N;CWAa52pVa+5J8IamWilZE$41|utFuG-qc~4 z8%Ghuu5_=@;Y3*8ft6mUtCgi4%1h{GZCN=zPaRS&#@Y-2(lRaHua%-pEiL(dYRQo7IUBMs`=HBph`1z3$aNbgYt^)Nb& z`)+Nlp`F94ofP94Y^aQ_t`caIy~kU%)z)FuV)+!J1SL(rM`Bsb8lXz!FfD&5NXKim z$f!OoOW9(z9X&&Hb3R`#6$DP;e#-ZogRK9mGHw zOWD8(CRrhfmQSs$wrre&b9mmIP0La1V|{R5t?V`#V--xA#?<(k zWAytOn^`C-|ISIlSA!-8RIy;X%wT~Bd*Y*OyBKN~Hd?k&TDeQEqlQ!K9}f3}c@rdi zDORbITw3AhTED96_?9hFnik1Azpw}sIO~MeOHmz_qOdA?*q}8X>37iR)-CwK?9y=b zZW7E>n%u+XBC)etO4A|U^jWg~xHg$IZyvmve&9>07h3lO!lJK1O*=(E2@O`D)r6jg zwkr=K$vZfZ!Tl0>kSfdu{bz1fDEz8oT{G0^Q1@rJ1QYZhFGhg}*VozJA$vGgG><67_O|n&sIuKYi%Plh0pp`6XrNY*wQfi1y;6Bgy#P zRof>SGE>%x#h?Q+rCdF$xGDd2QdKU2s}?1`(!??9Ew3hdTBbR`%`K@^wYi5a(mvT< zS@Kf%CQA>xY!8S>$qv7}nyFuST1g;H3?xR4ku6v4m}ctRkym5aH;b2!-S~fe@x^-{ z88ify-F6PaD*GTZ>e%daw?0rk(w7fGs=395VYRujxzvsmI5L#K!DWJC+`(t7$KD!| zU>ut|waitGnYXo=9pe(AiS?e9Lh^E(EJc(IIPPnO`w}ZKoc3B@46y{^1}{%_OI%1K zeGg%W9TwIB`!+Yx)0*{Io^4Q7gEOH8M5N4SK)NvL#EvvoFef~E9Ew(&G}OaqZvD_@ z;!LIxwcWmX`DB+nyL$diIL1V&aXqknL>$=dpG;%b=~Gn+D9d!0Vu;PO(dN+9wy#^qja=)fP@b8Wt{XR42*j;i+phL!s!z|b zp4Xh_%4(rBU#Wl0C~u3gIdv@>4*FBf4=qu!IUR>O%M5`iFQ+Vd!x$CQkP?j?YSUWY zb_FRag;4gFXeiXTE9#DQ;!2yRd|!jo-^m9kN~BYccDY)YSg_PRR3~NZ4q@n?9jAy_ zO6$SZ*5@hN$!VP8YHe$>FRY0Mmwjb(s;7&fvIuEqcM=&90bWlv#-}z;Ht}ZhZ<7bT zp1X+}_DHuup@;rxy|xjiSx6$Iy*xo=Kt`+AZ=}mDp*)OX&DBLb9}_%rJhEVQgDnNp zsk1)h6oOUz1fd_A6cSv&1!eDu`k(|gS!CP$Q@nR6#?g2>E^b#;04B6;M$PzuZcr4n z$GNcb{u$lCtcUcGz1c!{sd8wGyKK}v6fO~+@9tS?_)vJu>frt7P)S%ee~!ZO|iYBk%bAesF-LTlJLEM=^f zh*E|payx6oT)B_us=ii83r;pSJ~q+Di)q*_BgN?|bHpm?(rWP5+OFy!(u)r1QZ;iK zRKIFu1Gnn#pin>~^dW~qd2!QE;ZMmwCzVPy~mtHyN?Qbo6wfuP{ zp`~Uup!Q-Mplq6cv62af?OYXW);F^}fJDO7F(GM`OM3?OvTU_ZD`PiYY4jKAK~%#a zVvYHmTE8s6Vw7UCw31_}IQT8g6K-@=a8maM%~XnsZ6gKlDHVZIp4INr?K}VSI}d#O z=Bx&X7{UvKXiThwM9!52sXOp+(I=*22xrO8BmGfZv~-iAd8YIqPUji82hLwESNr9Epv z)7m(bS&lkn%!iGl6fpL_sc1<9`O!8M#rSAuiaIUx3K%RQV`9Z?(ya-x7mo}nWL~aN zMVdXVfc_GzvGcN;R=4t4xN!_chRu$(DOs}(b{Tg`oRS2v6OSqa->M?}A44N>nriCP zi2hhOJJgl(ZjzVctmru(Sw#+9ur9EkefGuJTrFGdV@DelqsXdNtE)LkwMixFut%lRo;z z5T}c(JZ%K)qw>i86 zCW8_`gdpS)^$LRa`4SlAT%&7!wYHMbLad=y7M*M+W1KOpput0uIi7r=58A3H zoQ93k=+>Ii>(_d*XVRkSSozlG1>g`voCBO+<)qMXG_78m>r-mvaE&}q+LGKd0Buv1fR5*OQyeT zPa!-+6I`q1r(2!*mpXB0DEshOM3_u~m8QONuJctS1t@MsuuL z?N8Ocpur8$mMy6$tAz%$%C^2p^X|!8?z#6%f4}qc(fMqy)n!TbiJtCYfRxhazI~Qg zLuH6B^{p0VuBw27WYDG|!FrTZH(hIg_S{JJUhmP%i)}Qkp8R!+qg`5()98SY zkVk~RO2$o8$C3&X&H|9qb1<&g+#nas{-ul>2dVnh3f+A z$tR!Hd8X#J;FV6J=hWoLhYcy~$1J|Cb>!Jor#2|micS!&5LeO8ienONAy>;~)E$R+ zgB`fN_PHO2x{E$emMA$y*EEiC*`qu4PFclQDv2g1{mJnqGH%UuWy(i1+FYPzNGN0& zBij|fw!A9TPuRR(%~y7CcF_BH$Bux`KF`{P}DWJ zdu^(IPo(neN8rV5U;$UG(M`b3t{izmhi{$Z>00Y~VPC}IM|cUTsZl?ZA1 zj%XV>M2KpVU=Sn2 z)XEDG6LzUt()}Q-4gG2qzXqLTF=9(Azwy}zAK5r~aQ|rsmOBg4G!}l-vt2)+>1#-^ zYbbBbQhWKzuU7#ff~-T4rSy2NZOAD zuu;|mS3moBQ7Ib^5+y>;&PJa3 z%uJgv+xRb(OLR6{Xy#iReMC-k*X0lieRTxPJ&&e`bPN4ICxtM8nUF5|oL)J-sM!qZtmrCm| zd>vgZYhPW9vY42NEasez&IH6rQCw$eS&I1vvsqIaFvkC`2Lb3XcVTizl}K*y+%-U|xx=`6H3 zBl<1sZe~Q3=iZzfLu_L9j?F%*+_1*un~_~(g_S(K)8Yx()J~+;kh5MdXdP0r_87VO zB@`%OlwQY)mfxvsx>i~Fi8iv9{eabSPv3Z0KmbCz*lS=*z;?oU0RRqHeTD8?(Op!CNx6wzftsnu%dYgAM+(Mug6Xt6;uc zIelS9fC+n@^nzv}_>S5@+}>`Yd#?Mz-G6sOteQ{-sMJaH#Um|o2%VH2ke(Pabd#&U6&R+ZM{n?*= zzQ;Zq*^qE!U>pwRbbN!8rH%x}oG6S#p`HJSZ6QMUW`0?Fya z0iF;$^-oxBA%-&Nveqc!aOPH>q2gEkkHs)5JADikcpeB{+i)Jo>xSz1dC;(RDZ#njY9!=AZSZpL%f$+)eyeMmEuasjh^ zaZhI3q{57;x%el=djf5FPNwNiEKzJ)rVl+d0!yt1IGh0SEKq37R9n8lk#v~)QjK~8 z_ogRRPx&;1ewBcC;o~+YV4Mpz7Z?*p${&ri4^YZwYw=$5C>q_~dkxi{qUoej4pb*s z`M@f*MQd80^6VRR8AN{_p~@=;B2+16W~w-Tn%#w=HpknF$;igCG%|PpmRVME1fp0! zRiO`X`u%&lwuIN+MPi?CdHZSF^Ci|K|007LVq0QbGC-#Ipd7cNK0!XOzPWa47DZX1 zx^x`OZ6s&?&G4goU0YhEDaTP*e*x!U|4-Wj&G%8_PNC^As5M?BZpR?sEpeWcu!D+X zl3f6uo0>HGRyDKi$EwWzL!d4*g{C5#tUKApN!43dTwtFXH&?Z$AQ{u(m+a5#9@wd{ zJ7ul0VW9c41;pUML@4&qL3FS_;f=m?osY)OBKusRHRC?kbzFImZ1N#nEqCCtT|o{Gu|U0@w~sl8qJsDSq9B3tX* z@PJ3<*XH)ryl+I%r1t06?edUf@ARUN!iGEvjUFB;aH2#&1qeF1n< ze8O7Db|?>4ix!=-$sc$LYA=?z*fXsoOT1_-B9~PzP1p20C-)MPg5$PXl}0DaQmBc^ zP!lMG_y%nFW$kG==(RA@@~FkR^n*07=OdTdcM*btrMaN1;}YV)4Vut!j4;Dp@1XL+ zIv5AE*p%&f@>SA|`!lNG1v^ZJD6$8nJhgqO-{;4|A~NLbxI0nH>KwmerMT?zwGx(@ zf5j5`?WuP~0q$dlDF=yz`F-vQ80y?J#^c10S5)#}-k-fdbb97TJ&W)EalC}sq*!E+ zkD3>R)dNA0$EUXK>9YX`6if0rUwtb+S(}xNygw*0NeW#nf7#}42>vVm=jzU+wPxks zV1L2VG7CxZXf^X;Ud|%Kh!~Xhfrst;i_z&=zK3%oR-o6gP*-bHYdnn$MS1YupsF&K zV{KzXU-k1)N#-tc+NwU%p7F&upXdnIX$33iht%NnItA^sfab$)*QWGuaY=I%(W13Y zM*y2N&-BJw>YYgRrXFeG4Z>Z~eKyK83IW*ok>wyn)u4C5&m*zoot}be)ma_hyL#T2 zpH}+a?F(Rb&5ZV$_AjEd(K%jsUcRYuP=k{3_`do1?Y$4Tpw?r7gKw{FOFu(iDkau6 z6^2d5UC}m{hqd^=mRZmK5cvDG*<^>)jT(C3w@Z<78ovNiEK`AtiEqCE-FPQ$Ru288 zv^9?eQ)v7*BLJY+lQ>}|TKNuMW?T)t@{;Y()k-T28v<=WR!hD4fi2W$bQ5KiIhZ9|=IvvB}u^w4aKVGnnESgIhRl0rAsMQ@M z&YD?#=Mq{>M%}B>a}^R9;mB5KsO8M072?D4RMjgk;YVO{QRf?*;lJ>NmV9_+pLeB$ z)l#)ak|}E6ZsS>Sla5l?pslp*!ecouQnKa*+Ljj;f_Cspm49et%eK62uJRenyW*qXs7MaVR=D0|L^I^| z@2|K|LY|I1W?0r$3=9H`y6cO)9Zfn;+y368MK)LIs5Hp&Hw$1|M|tTuv`DceHy$@Yo8IH~1^<8uY5u-X^4Ud;%+`2-IV_ z=xBAcDWT5FSxIZD$ewyaS=$aZ?h0^Ty#-bgGbBp~nTZZUM5Hq24{7ysE3>Lp^$eDu z#z3onzs#V)6clJy77+q(SE2`zk6X0F`JDK3FYRI8pK$_J;@U98vzknnITm)KSM?(} zd&w+#BpYt0?OqFNzEATz49Oa{3D>?;y}|DnjI*!u0$!eFHMkCNhjBW6d(vq7M$f2$ zv0?T#Vj9$t8ES#+c(!0qWx+YI6pUkjX4vy<9G5ssH}Q+VQ+U5BgXj&% ztnD=@LC>9W7U#WkfEPwCMj2w&z|(;*^-%HU*WTKuI!2KHNZ?vZnncWqxLcMD?Dqx* za(e`Y>9^;q04kGq>dJzyh$W3d*%4YjuMXngH}dl~&)*DZIgjM23S@YhTI;>9DMf!9 z=R0yo^vvi)rfWXlbB zVUQl16ChP)%2fmvtjJkCXYQS_> z^bpuqXjdyNh^Bc`d(KOz@Ai1f2WlagZSQFPwM>sEWUQDhk|rMFzgEI+k#FPZW|tH! zQ~E_SRRxbxqgm<~PVmbN`>93aylq?dw#QqPr@!2om+J5DZ@EGBkf1*#Q;4@8B zs!3-a<8)xr^ zk`*-RJ*a zOuB~i?!2(2{xUs3wm8t7JNt=`Qw%LqD%Rck3stc#@l$-k2!&G_)~tm2I1y!5%O1V& z6oE4bXVmjtGUA@q7&kefWc=rJdj-+&2U?3gDqp2KyTWH`2d%uz45^?J&}pOUr3}~je+ti_xdb9 zn27GIU?jh~W%5Gmy6WS~X!v9iw}p5C6Ao*ZOIX;XqGo~KID11=%Y{Ma(OwVcJkQjg zsH$W#L3jNZLXAUB=fDiFUI9e~pv}rUUW~z%DEVX0`()jZ%^JOfU!U9r9c)G9N!Svbn`OBIoeh|KUEuj;?yl`Am@Pa!B-&_{Dl$tAWwWl2Dd-YqML?6N1 z`chWtgv5lidSJHrpfbCnRigq@w-T)Oyqt39P`vZZHGNkWv0f@mn(?bXQjA7;9gO!#P@r5c6|IUz^~sE^q(@$HKqgN49Sg_p7?5nK{@bEEK>bH5*ccf zf?I4nPVvGD2QCYmtV@N%6~)^-xu=fGdF>Vt4~OG*ZT9f|P|G)qG5d0yH!%j!_m#_D z#2EX?`AT$?$zj_)HB={KU95qd~2V?+RGJM ze^-|m_$rt;^utMNO}ze|s&Vhmm<;Lyy5e4b<7)mHy9Tm*UvH|!|6J7|^*3&DNxE5c zdQ_WyoM@P`T7v4}Vj-B(g3Ho%WN5lrxHzK8g=OJw(NhE6?V{(UCmw9NPfOIOYErBm zdp|iyG-IekBy7r=uJet0f>|>Gx<1OB_L2oOF{q2fJ*%9unydD?m~%fzrSw3<^f%hV zb{6zM#a?k>pugPzXup=MAyHnbwo>0W0M_|F)Isxb+x@oR_XR`ndkq6?T*nNa?c>C% zTb*XA7P%_E7s`0aY&Q;?*}42`^ZXWmSKCulm8ELeSi*_AX(ZOm&sItn@WCf?DVb#z zTFIukt(PXB>+5S|t|JsydxgRnWedk*Oxk&-3V^d}>4ZkXe1bc!&Ezfh1x_MC+rL>d zo<-zdJ!wiDWonR9 z9M*{9%+kpqba(JY~^rZ-=D4NwD!!$vL^H%LZ5L9aTRUx!JBVYCYN8Nc|x?H4s7=LljfVN~V?9 zNMJi;^Ld=v=fF~UR&S4Jwh~OIq(_2I{O)2Qo8LNJ;i_9XZEn8hRe;~`-^Q5uGhpXt zW%8cy5%eB2HVO>PVlD0M-3zsDUK9qyGUrX<`M?~irE>NsQD53fWA{R0>(chZV_LI# z35#r)CgSPIp6;%i)Q+#d7Ect(i8=p(O|I#5$t`~AYUaa%H?nW?xIG#8#4^g>CTN}? z4=<}gqa~-w=N;~40ny+S>Vsz;CX^FAmodH0wdInn*KsyyZ-jM^xmLa{2o=xTUzWF4 zo8$=NiHty7ux6*i%Nr(ivwb_7d>y^EzNB63c;4Bz&z-QjbHLiTY_IHeQeEfvzua3a z0^j;7)*~op!GJi^AH%Mzp;6=ZjuV%i%UaBh-1D0vC41Q?vi_unRQ;8TW!0?}s3!P} z?~DUf{MuqQi5cor=#?ea7x#?f$31w*PryHD+)SFUD{L&=0iPxwCX^P62@gKW+V8K= z+iN7z4lr!&*mFIq#I~ZQ^EbY;vDDyjCpOWo)*P|6#(H&0lXuO7y>j3jlDgnb z7-Qr{pz>;dDMk~}6#d1yQ1WZIimW?$C&m$86}!U}rQe`UtO1AspbIIqx0(p)Ey+>q zE_{+spdUF;P8H6*z3*sBw3Uh(RR92zyC}_v42CJV`gS3#2bQFsWZ6i|yZwb<&MBW9 zH)0^_e(R8Q_vBP5gPT?FG%N74HJ1Gm+jn@#3A=(Q{)9TFsU^n*p|onQev85Fx6d^> z_dy^V^1CU8sn|rA|8v!Wq{HvRx+fjUHt#LKwm-6$N-mVlr)MtMMQj4ERawL+E+R0tGQfuEC92 z2cwdiJgaw&qO*jgLc_G{>ee;sM8-#j%zz}%@}8Fz`wg>tVHE6KX(#$#>ie=3XwTM0 zhOzh*Lo!{$6{^+Au~)h3>7Tl{(3*+l4zg4-#G#1|g*)I0`cwqoG>J;#S;T-B12$zd z=vB?ls=Q^2uvot)SIG6X@_r>(Idh`_TD~{(yhLUxB*vT^RR7*ge;}5Z<;oX*roRwE zQnhHGxB+aQEKy)Q0P;eHilpNdqpo)Io}UZ4X~=FpU*u&VTp@n7iR$*os3*Yqi+%;) z@Y3$JZ^#OjiiUv(lzRf1Q|LS_Ohe1|(_`=48aMTnRF`?DA(7&q+{m0OpXjgj;331#$pv7BH%l>v7>T%TaXIlHwLm7!?OLS**%UJ zc*o}TVp>8^NBHEzru#>?lFtDlJkT<^GcOp8-5WCW4;(o=yfoR;+hnheQJ1IcVj3VzJd z1NHzveShP3T58gcRt6PJ5Y)tC0|$Olog^JN3g2l{H56O3?6S4P<_8_$ywz!qxKE&e zv~kg@yv1I`;M2IR|0K(U1$WX^Rp(7{R4eCWk~v$8>+ys5h)Erwtz>)S>_=OXYty>g zVG8!4`Wp-{!-GLK-9o zEgB>x1B7QZe4PUR+Q`S z$)-0W+Aaq26GLB9OE{GdUk$~~@bh793<(~mcqGz&?VnmlXELDedxbCQ#A&MHKfu9_ z<}|tZ-AnIyu(q+kIt<6}J}lo6EU6;CHo%W#WIo*qC>srnBsNe?e7q1m?|5oL8bBuKAI@m|{pPLSy4I3VJsb1{at1Z7x~cGBjO zGgm4EPfzWhDs<(nWcsR)!mPhH+jRgt0W!!M{FRG6bzw;UvyXt`9Cy@hrxBt*0!wvY zg3Zc&3lebWK12m&VVe%PlI=zR#usm!0`aObXtJ5>u~E$Xn=NPQ$)`3GZbey|sS!V6 z6q$fK3Q49pas)FLuD-SMzWUywL!no7(i!sW=d57$XB|qel^b3zTQ#{-^+qqtOtRev z9A*K=F+Rd#%3(no*p>a~DgdK2IF9D}@C6eM8b|r}vz*1ht`9+v6mLW%sViP{thX-r zCWy@K7u=88`eP)wn%=O!H=WIYQei_cAh5_}yD}*4;)&Gi5FjzpNJDj?;I$_<321v|SdZ_eTgDMiSZB44 z3}zHPkb}Q!WqH&MoBZu^MT4eDgH_B;(ystbx)$E}VWSi;xvxH^M)?>Ra~z2$cwm5FMUxIkXpW8EXnAaZ-J$rdhTQtmhhPnedZWzLO!vv*R@W3&w^~<3QQu&=L-~J3qVj zUEDHGEYA_RTd6pr7@aE*-byMDT7eqBEi_6m(z}GjYqeiQl)KhWvl)Nq!{f&1&;}-E z?vys{pDHEplAmXcg2p-YEA6>5o2IxW=fn0saYX^OI#UwegdFT=h2v=2)+ExK`S2Z3V7E$Wg4Ju5wggm6T@XQr{mAw$HF z2d;kkcD5&yL3ztIQsHH+kLx+Bh&M6b)y;TP8iQ1n^4vVOC_VCY+AmI;2~UGA&|kf1 zmAkf#PHbnQ^HGAtO6jyLi1Ajb2lNw#m)nTwnH#?f`bOw(KU#OY6;`e!sZ4;1c z@Kq|V={6rB*~b&ldh6eoy&*AlWjNPus^{s}iG?Fb9yd%SPnlbap zA_Y8lV@zU!+V}agGFocd=$5Fsa?{{RHSki~2Qq7uD9v)+L&gXE{b`Yfgxnrzf@SuO z7a9oSJQD1FGY+Z3vp?VGn=Q0bQcuvx@Cf0>`_wmNOX}uL1i2F?&vJD(+Rs=3>wXVQ z>fJHKH#^pK|4Hf2`MlL0&czawkU1B`NJqN?j0bTDCI7K0sG(Ld0{l}9x zfWs|Yl|Y&C`u7S&*K8V7Wxke4x1Vn-ETGZqSK3YJS&_9dAN%CZ%pe)!I}I!*6mFGx za;o1ltmk?Ya^i}+0s7LuAEv2#b*%ac$U_qvzur9H>13`9>z2i?Ur0}=-t*a#R~^dn zT@uu_%N$%YZem~G63*lNP-iUvS*34mvZ$w^wFSkdQXs=%uCmBiM zl}(GrSM2f=0;~(Dy}?2xOP^tO$GI)_*GwNN*&~Zg@O&gaSWuuPRV}@hY zn`D(jlXMLa{0wBsH~)kuVG#1uoo0Mxrm9s;g7?593f$OD?ULJP&#dc{v9*+#iDzzB ze7?ySX&vIfiw6eY)*-SVY6l-a>VBd)^r+)s$m?~;o3D*su;iK#@^t}&hTF-_89T)? zHbR?xW+OdbM}|~aQ?*7`3tbIuc^M&Tn`nf`&gYCAZc zuHSU*%Nsd?G<<5G_7TPcLK?frCx}8h(3SqWbgVA6bTm0`RU*P2!lI=ZGkfL7PZDt( z92VOU3byC3i96>t^9LF^JCV;5_>Sp}&7WLvb*gQxi)dI2#x#!Xg;t%JS~K+$iuJ~M zze+rh9I2tSki1*4AMSo0+VcdBqaW85b7cyl7f_uZa6W0916Zo#$n>K zSqa4iX4A%N5IZurk2(_Ou9QDwZGjkBzBiJz4DB&_N_ADhL042HEiVm}d$0jE3E1|1 z)W_d$vODw$b18erl|9KJ*<2ZZ)bjuQfyxAyKJw;Tvq|E+C*QCkz3crBq^f#Sz_XMb;YnnoOAX;n; zN)EoCx|y8&&C)}|z3Nm~;-wVKi<4BR$@oHsjLgv9IRr|pBrn`f5Yc!M0!vf z3@QqLb`@$q{UmO7h|{3)B7vdSXK?t&H0;~9}aa9a}iu1UDDFF0}%@T zlo)zoiYf`fgEcU9sazO(QSjbWS=$ejyGKvw>nI}q4V6XiN4;6q?1q%zxPM8zpxWy& zl|7{k%hPZy&&m zw&es`u271XV12~@_`@1Y(X86Ev?RHm&{*aplFJmNKt{ zEW%Y5*z54*5jZ=ln`n&E_>1CI4OuTD7aI8QX$?bGbDwPF#VQ}XNC6{8eVJ1hKcoPX zM;hi#wrxECtHu$VM%7ybT)O`kr=v3Tg>vnl(T8EWE?5tYBJlUiZXC^kXP zvNlJU0sSry-^~-hjn8i0H*rbr>5dT)wotJayTi4-e3mhe$(oodu|wK$r)LGb3?v0x4SGS8*4y|ZJCozJteu+ z6)z{XL_!w6iOrU(J$-p2Js}C1${pvXsPId(yd_we_VVp(+2YpjRO+17d9zsmd*O-V zwk^+eu}b1Z7Au2zVk6Nlw3;~4hHjOycp)xDk!eMUP(g z{%RV|yRYaek0~88yA@Aju}kBn*VLLneZExgzO?Z`=dmj0l)2NTAavE%sJB-+}Ej8bmw}1Rs8RyBf59HP!z^{-7YN|76Tnc5sKqizkc*zfBKO z0`Ia|Fi(L{T#^12QPtk*5hAJxW?kF?tcJI8C8vY6aF#M5OurLs6vcRzZO;6kys)`Y zDNl~r%kz9HDa4{PWX((Xp`Un5l$SIh%$Vp|bH`hO!QVyVkyHJjIV`{OR#)q?8pP=- zZ;~^Q`qehGCVFXBbVf$Lz1|+E=9H=Qb#4gTW5LEeVw5=LterK`?Rl4X^Z9!S!NJd! zE+T_cPs=n!)Xx%|$%lo(b#76zx2i>BD|M2zymev1PsQwS^{11frZ>jzd-uyel{I{(Bze4r=?oGW9{{egdOP2Wu z8vb8~;Qx%h|764e--++P1qS~>793c(^|wF33!L}*d)HtStjc0Aco!mjJjdt0%wO_f z!Exc{GN^pobrP0&Z}QHFBt|+I^^NkP_}nN8$F}PMz0+;jhkuO(JsEI;58MWN&w=o( zkJk)Fymr92QOnq<$$UI(2!x{Fw1$b9=&q3DzvlDxfPrfPO9r>Ek+($J|B4|WT6@$c zA980&=}wt~f~!;PpWzkZ`#!Y_ji8>O4CIt_ZOX`uB5<{}p?w`w>hFiaH(eIX09i-5 zyt_zl!b%u*;89%HUGWOU)h$He)89+5O%m@mF1QuxW#kKA0}6PpP@JQ;Y?Le^PQ{>? zL3jHPPU}{2R7;2pzAi09=D6jYK6KS+n9sjS_xj;1?xMna>QD4^_&{gk3M*GT z3J@b;a17sBg<}`2lfns9=$0VtMe~ehK!h1I!c(8~( zvkC%fvuv^7IyiI&8(nWLo%E0_EeZJ{%1*<3YbXT}vYHRGu+{6aQzF)D)MMjFvixpH zL~m`lIjEKv1UBM`a)ho-2_=Cm9;af+Bf!n+l5aBLYH~z2(!Bz?lP{awarD|rV1tk3 zT1{+|f00D`%fMRDsVq?cqB%-w-V}QA!z_Qh;EO%wV2z!o)x7 z(tM@&Y2PErxx@2s=i<`Kq;P6o@3?p32-)Ir*L12?cSw|Bmps7J0ALa+)t2m~(6EXLXCow}udu+CBCGy+yczXaUG!gJ?CE8vE(?TPJ?Rz=1Y>sI7V4e&4K+^4)^xg(4rDrl zE)n6%l_|VCmq2}QL+I&p!}xNdVmqu8Q~Bmyd()i%Fhmt5!k_jG0tNpQUY)!7n)n*WMn6J?E=$BQF&_bc`#hqHO z^Vbv*jLQFN64(XV^=Th=3S8e9Wb;|-uR%DBcipKz46Z$l0#-fGG46bubXPoY1Eke9 z1H2z|eEkD89SaL;Oo*qpwZtQ3GKlryfEtKwWHd~x>zcxA?UrC#gVthaBp0f-o8@y4 zV{0#(wPk3a3)rhGLpwxSBf5s#|0p7Hp`z2X6V|Jz`7nO>w#oYw;~#(6iZhrqxJGy( z+r{pB25X?*cKe}4f7cg*=X;CIO1j5uw{2?QM#@!TNssN$Yt5E~Mz)4?A~&IYMt93T zyIC5@sh^KwMk8j&=dvRCEEI$18%(dfXJBhh8?$AQGEw+lqS&sG=Up-_5Z=2|gAnn6 zR|@Cu8hYD|^CjKFGw?gSZo*gw|AyLlBeccg_#ZmbbR0-vC$(0GFnQL}B?AuZ8du27ClZ1p>E$9j#^pEw_B1kwvnD=mW@TMT=R+g7eroEAG(e~Haa~XVt(ie*9NWm zRV=Ul@`esg2%Y%+h43D*0eBkt!GSaM#ei&IXJls;(9k^)4v~x#tvi6-3v|h_@!uW+ zassGU2~Z((>IDDggg6*fx&d2dyZAl~q5uXu9t3T=)xU|2GYEiGEP4GaD7xsT!9Ihs zwUI?FxB0R`XIo1~!uIHZ5gx7fA7T-M#x=lcLN875$f>Y-Fc17@) zFS~oSjLviHs{K!~i#P1PF-o8+;%$;IAJ2=EZm=o~Y!H`5fyWhVZKBh!_Fx+fUT`8K zS?)#rHJR0gV)2|O*<+I zf9M)y2Ocm|`>(afA`x1#lmVSg-fbT-K0|lZ%E@c|sC`3pdQgeS;yCOcm3RE#H%vk8 zZ#u7kh#NN@1bL5$!GnUXn?z0-{$>{!BQo<&8<)s#hG@Z5lXil7JJT3J;1nBZ39 z<(L4DQMeQqSS4`$rLq`_?r{e5+GRL$laF)yRHNm5RtPa=1P33!paf*QuH)pwW?pK3 z7rWcjHN22uKQ4#eMcVqCxuuT4E;sN&C=VUIWM9@PX1Oh|tElGRYE)CcQw}#2hNBYK zWpS#}zvyJ3O+*Ucw;DqM*Q<)Tl`{ZJ9lz+3)rT=4a^f@q@v`ee98L)RDPzTP`sxFK z3Vs^6+dz#>#-Cm2)!HcTt%1*VL1*pGLj@t-2qS1W3~^@U-)UX>GEmZCJIvF4jrUL&7 zS7XnWwg$VU(}%qjF~nx-A57fpI;N%e4f?d-+kJo#Zr~r6Aw+j8xrn3s zHqO2{M`$<_4L@*0)11l|dVP$5V5Luj!9^Iaq>barZ+oZ-RDSQX>l2VDN=Q zvR(ixl|7}({yXpcTweS(Qw}^IQ5^_`i)FhSBfIX8$Nje@Piq_`Ha^F@A!3yMQ2}|1 zoW15dVSIA{+c2NpH9sQb2`D1B(>|>I17&wxZsCT@iAlIr)wtw=^iKTp^VSaw$)~MH z8l4;8`ZZ7?uj`{_M_su{ko+&Ufl+ewa4URvmJ9FKLLMBh#g=qsjI5r|irqhq8|7gr zthi+RqNq<0vM@JGVY8#H3wll|)Lg=GA?NCV@)ZqOGyT*JD(GS7_*bZC%le#~9gRs9 z*g+k}2j>mkmejJ(S-wX6jtcLBf~cw1Dq1*mLB|C+h6dsP;H~lG!I&R4JP5_4|IjdO z24JH=&`u&Xw8{wS&CiZ{t9|;tyKt~Mt~@p!+-6tPR!~iea@(FmQmlq{?PZtK4DipN z4-7f4K&_m}t0t{}YLXF%7q?C;eHzo_+qt_vPTPCD&pDH_HEo+HBgFbq-8G+l&-lTz!$x^LnSxEDou8f|2E)OjEL4ZZ+;BL%o88h zAt=^;0;7JOdIO{Kz1kSesg&=ueSC}Z3gn+`0cT%WSa^u4F(3)*IQ=QRhVYFXxH&_3 z8TkIGUwqGt69am=#$VqjcHJHDXm#F#QjH!R-=UmlcKq@vF^&IUMOPOZ{I0pZx@&)S z>!m7Vu~)}+0p>Ex`g$-3y{Otw4E8Gy4hB}oS@vG=QG1U=s9O&n&Y-gRH41!1ygM!i!iad#V zUSn>?{aKNL+~we!+azGu!zPaMjr^*P;+y4#ht~RUF~sX#19f52Atx$Ykd;7I+G@r> z`^E8mwD}UYqIaDmNL0EJLSa4m)LMgFZ(;4eMCIV&9AO%`9B zWAb~ZDKjM*Xm%HDL7AFg4qX$Bx$3t7-BqC17VCUqBN7nN#;&ZkWA9w=NPGwznGFCK zA6{Rc{ld@fu0d|USc(hMJ|+I z9NuTsDcS`|vD(huH@woTTM3PXAlX52SQVI^L%bLX9@x16*bDalt_~+>-vTcC<=`O_RrRHR<2bTKZ!w< z!OVwTCi5%FPHEw!>Diezue!pI#r;pa%F`EycjxCERQe*Eva-f4w5V|_M%nvrMOdyp zWl6}4E(2uqfxa4$^o4$Qqw<*73kq6Ro%`q{BqSrbOp4=F0r2Z3Qg7pY4LrXX>-R$$3ZLQ5`9lOAOjFh zva;3KNNx>@Joz+J}NAxANnQ*4%qva<5Fej$4jL#Avl|Q^ES}?v8r)L#S)A zUkkW?9{)4d6&kxt-DSY QXs9naX(g#@3FEK-2W|gt?3Ms-7zQX6OY)9DMzx>~B*b&|hJG>#U zDB2WBQ4%SU00EM?2w+akJv}{rciolu?eAq~Rb^IX9o-mFl!c7Opz76^U%q_rd++_; z_r3%B>eqfP^V#*;_1X2=_1X2=_1X2=_1X30F8s45`0V=Z`t17b`t17b`t17bda@T8 z{%=Eg`pCCp(SJv~3Bz)wJp7wE&fV$Px`@Y!?R zy{osM7?LF^zBG;DT}119o>n>V96Leh4`brTnvpLR2#Op=H1r}!LXdJe>ImO;yjIg_ zHdJ|c)3eO6YVav9zn2kC(Zc*Ph7+Bq_@1loY`V6UAj2`Km>(uN{;_K5_r4zV7dJhN zVR*O3&|io9UZ+0(fam!mo6aAnas4DcK~enld?qG88P8Mqw>{fFGIJjZ5I;SM(`3BR zPo*5tx*&T}v6uT}HGIQie3FGY z%?it>VSEuREzVD{1pykcc2}wX{IB9o2?IyWi_!d(#wV>ox-C9{*zYeUD2AV3jpR8b za$Rlbp=+C=aA(Hl)P4A%AI7N^YM+I*p8BZU_Y&jXPdvsSEJ9cYXC~(19Y?exV&Xvmk2ma5e=(f6dJ(mc-)$ddsu=W_c;Z|p-d~=pJi6(b#*>_v{UDLC+kA$FVRLOmY-W z#W;N0E59(~npXYsZfobjwd_yB%CjB4)&z(~u?)#FYNZa#>XShfp63`k%>NhxW7u~M z-Dp&M(bcF1!P>twl1OpP;7%E*KE7jHfLCBnfoV>amHMNN5$Nj4Vd4yi_0`99R0ShR z9HBVVwJy}hwhWxW34#DAQb2z0-SqR$A}+Lpnda=xh;|z`?x{uQMK;lk{O^$F&q4=RlrGn18fZvvKFz zAas=&RU<_m8>cn<#yhl6tA{w>&&`}!%&7)2s zNTa$v1V=iy1KYe`D&5s|79j^Lw81)#2J5)%8B$_R7O*F@Y~v)sN?EPmc;e`l&1D_K za!m8s9IV=beCI=i>(`&9i_=F}sI>XiV|)tJ@XGvT5gR^xq_u_tv)G3}MUeE_&$Ci4 zzOkxRRc&w2cbxcruIrmRfE>>aHpv7IgB@o$!dI%=oCAEf& zOMp}vhTu^9lojCPXT-HjRDSB%dMvwfC_lJ@6g;cIXL7j8Z3uI#ai~1J7Vx=1=cizO z5ay;v?XgqzSY}0T-FO?d^Z8$4CZsr;s2^&^;TFhGoD;~8Wx5W?j~mDjf$%fU5WZ2@ zckcoPH+Py83xM(I!kk&(9-;x+?;j49Z>kg{V z;yRTr99xfNw`%InT~wd>)4hB~2w*~wWh-@U=N_uh+$k!X#|fG%E%hsLhU&4<>spNi zWh0R1l}mJfI<{-_TD68*-|d0I9>|aFIgS@@a&bI^_Fok4Te5NZ7){ZWO9YoawjRsX zTV@6EVM>bxCk<{KFGYzJgSEEW(Dyfx98RxLLhjglEL&~r2XQ|Ba2+d%jcLIq3)(4= z9}M;v7(?T}(bD!Gq5hgVLB{GcY_)h2t0xTP{OWUBWfQQ`6V#2-;siH&LfyUNn9AQ5 z^;NG1OU*99EI8(!6hpH-OR)?rb*}9m4`Y!%$6Lq6Sia}my79NsK#pmR-zKS7-WON8^)XBv7D5;vuAyV? zIZ0C;RdxVFbVdq%fUf|#w2hzRo&~!MOmF5^p8|P+4t2+FE1IDgkROIpZoLQZ1@ovQ z*O=)ODXO3WvjK+VNPgOa*S!7{&(cx*G%Ni4S`7CeO{yB#e+qkO#HZEf)4OlRI!z(V zcC%^Qw(CVpn~y}%_5gCpcizD~(}$&@S>fhRj@*e4>bcgayp0BUCr-YLFB~a|{dt_0cugGLigfO{O@Xc!S^{ zBo&U8vMa*@WOn8sOuqY(=a@)`DmU2arO|qu z0X=k13&ZgRkW1OTMtD}lXL8}#dMx?jRrLBGKWc+5EsU#;?$cw*8`lA+20G>@@S(Fs zoMtnlwTeA;#+$d^j>f56jmxv8n~rV4{1a1NW^@x~BY>d2@&iN6IJi#)^5a{YIK4!Y z1U$m)L70Q}STJ?K6a@bQ%10;up6410m75x(P3~#*NQu>^QMYaZAEdL?Wu`E5Y(18` zecN|zsE?z!0zOz+_cZazXu7NFPEY&5SJU*gy}P*Yz|!bwGEQE9m4SbdjkWY|jaWpLw#n%3reU=;%6iCiQ*578J)0n`uYS z#eJGBJ;2%=k2M?UNYu|LE!(yRijHl=+~yUs49TFSE|dgnO!<)n0A!K;u&^72`|PB7 zNAgQr<5{}Fgz|%^;|qe{_xjkUFv&{ggn_iz>y~A?eLshH`X+35^(o;uT1T4b|e8<25&5a;Grro>#g>Nvp=PkpgS!UdE+HH_zeTGSv zKdkHgOjEYn<12-`<#^CSJdF=;jQ$_6RC_G!=u<>=wAcR_Kd^F>hHy(~88O3Bl}Z*m zB|v&H2gCgUZzAYm`-586anU3t@&J+uGO!~gGn8vPx@HV`JA^*Nj~vf-_VzSM;2vq) z&KQk@$5mOducE_Atmke0!DDokNDYB4XxdMRPexIp)&u7j*z|$?a1?%&sqZLN8YJ}o zlQE|mprsmEIr|uPK`@hW98N?-jLeXL(oAFYX%)jV9r=L|luPNlKBV0u4VGS5!2yzc z=p=d=cb;PeE-`Qj9B``xbKFt%SkPD$O?O`J)9bN*IWJO>?8YHZP}%k82u?f>#tQlH zl3hQ6u*g|QlW0}K-3P$so zB@;ATeCpZGdjYP8ZguUU^20Gq3|NzV)@fGZy_oqkI3o;{0xVU2NSq+TUkN^IH_ND< zPhC#5Gj=qoBDt*Hs$dkAU3;ddzv7%^*)a@fh+YZ@s3BJ}I8|7O`Upe2W|$g*;6+-W zXTd}Bj@khE$(>jylJ9jSJr>l#RvS1@3iGGa-)lTQ7Qu2*AM{@Hr)a4}4w=e^>ahqm z7+)ZVtIxFM8PJkr!NP{13GTTj%pkhq+V-%e9;euht--t@Eq3}H!$aHF9zAGMk44iI z-QL{=6n)8u+l8 zqzL3DLGrVw?LO*p-RfMqq7-f)sqb&O;n7w44&NIf24wJOgAO$YopuZ{OdRx6pFI{kvA|Ex2#ZrR%LlqZRefA`bgQ4+aC@vy zf!b>6TKGCJS{r(Ox7oD(QR9@8BmnfKB11y^z`lR>B$X`yx@zq0s9U!I@~7S_=7iYM za2IViYt0eUf!F(mVHu9+QmY5`;TP6I4>(({Y1{Weo`=moe7ExmczQy$u2C3Hvt$%nTsj^k-(4*2K++;^F}bqqA{5A?zkO2k5Of@WC^Lmq(e zVWK!elH~Y$tiF!0V_P~}*Sf0bVP^}0;#!d%f~KYUWlG4RvjdW#rF?GnEWxm8yWyeo zgN@Q#CBIunssmJpg!(L=fYlnrNZ`Mq@`6V zD+To-C{cp11kH@lV?_mck9H!x(pXxJyM+lRbXF)#&A^f!$q&aDrlv`XO4Wp6eG0n% zzS47_VWo{R7`QX{4B@bLkHkWQ^>o^p6A4Dt#FD~4|lW&?;#|&{5&De4myi)U56k@nBcf#2@8~~ND`btDM}Fh z)O_{o+sd7H5b9rli7w8CHaj3H!{n!HDbcO9S=&|ayc_U&5%KZ6^5eNK9+#is5nOQ! zke;7hm7%b5?PrZEZz3())32~oOXD<7hiCj}dH0cg`zL4*eez|purS!#2K~=49ByJN zf(7kzRG*2dD%9uNk5PRtzQU9iQ!3Fm4UTW0V=WZ@Y?ikhfoEU-{1+Hx$Q-M2mt~hp zc487u6MjN|1SxlL<8I}h@50y8i(h5u3f;-p@3X^-)yQ*v*Y-Nk!AV-L?CV>|6O*31 zNMxsCH@7(jxBIROa$*=BH?@GZk9yrmen@`qMD5C(>IU)*6;>`$x#`Xp6EH?(&eLv+ z_NijJy_eH0tB`{vd?z75j#5J&ubIH(mG5|l;vhV5C3cL# zef<1dRG*G1AUaxItA6}LW%DNR6_?M^3D4^xmTM^(OKp_(o!damOs^9{afBAb_WAi! z?fP`&86EYa`aJ#w&8tgK^?J^R7|Z{Apz1(<;2y{DD;0Z;^wUD})2AaCeit5Bb(w7= z!9h){x77Z2*IG)Nws~~-IHo=Hbmkw#1?b8(RQL;F)<{JZ&8D2GQw&{s{34bBX z8dFtc*=~(w@>ci#0Z9sWX?75_2Cwh_yOCxg9yL%h(q`lf55c5Yn#@u$&a0lM-m75?-G zKO3pXavY!HQ*6RWUIcXIni>kA2QceX=&=A@h3y=|tdV*wn&bK(MX?;9D^G91U*+BJ z4$wYj`t?{gvh)OVeXv;q8_l$dBt$VzwPw3wg6f^^ppIt~}d- zKQ(adkLI7q89NNE6g34Z?5SStp@6OeKBfjR3+qAlZohsjJQ?h1ASeWM7098{y8FSW z(PJqaANjTcf6!1P^#@3P#C*S&lFH@*T|s3~eI9&tG(A>Qh5%hfd;n$*vGHhc>R3M8 zPeF46psR3PgfJ_noxz6av0S?+L>X=z+=Y&TKdW+g$T$t7=QyrUWxEl7IvFe|**i2ThHItNoXhfD{^(-8Kcj)h=WQje8lFNi_c6#ILVk|qFMArDjARD!@X z$JS$MyLUX-@?Fb3xHATf@Tpu%7#%1CbOnPH{z8~FTu6RtuVcr)O0{PnY2<#4yCRW+ z-HzH+wWT*b}*Ny4>p$k4E7lJN8Es8I8Wnw zo|q7cDT$bth{-Hb5OI;k;_5el=us**{AIA-R(=9!h5nJw3J1!P*LMIq7-QL{oBo;u z9@JS$U;zcp9Fw1nqMCrWhD$i~xZG^D4N-9v|3+4Vf3&QxxpD z7;E$($5Pk0!4W==dRCY@`dMKNV~v`J{J#Dkh_M{YKk|HsMQ14%iYe0#QK0EoQhu=h z`nV|gs~X5ppj`{%Ct0R7-lP4VF%(938>=@HL%<*SR%3@D4f%|w!`lDDjC%lN#tUYTAid%&A9i^+ChAJp<1Cy~4K%4)rfz784h!w@c<}_6 zb!6nZCY-nw@##QB9BT(_=!Ui;IU(k_hqdLo0n%GXP_eB%UkflMaCB2fJ1GY}0C%p+4DDmyuiFfN<`Cg~+g|@$fEItAdlH zbh7O^I}BrC{K6u|Fg+BOu6ib6RCWlM$1c2@2yWTNSg8nBSJeQfw0Gpb2aAiN*U@2f z=`@DM*FZFa7A)6h^97G&4b$nKh=Tmo4;{6MBG(fHKfjLC-3El!(bP>FF4G1<8oH(i z=dld$s&(YqHwS#U_&~%^U|6Q7ZQDaJMQgPRXjC1$ovlHOp>f=K44q}<9GEOwslJ8pC1 zwrh@x{yOT6pCn1A&;Qm>2pCnE>a{|EDL%Wf9M8Gtd9J+u$hA@&osjGJM3$T{5CtK= z?ur~M@GQsBEKN};pj`KQf{0j3YmrILFan%N_OpU|+Kz{r|96BF+C~7+@is#fZj5D?Jz1x}= zmmebG;+pVF^f{i)P3CfIPshzfeAjN?z3S@P*jw%N(CP$9AfwWhhKyXdNR&=7-@}KX zIceowLY`fx_3);flEr0^lj1PH!e+}>6nnh)@_k3)?xny?tz943+1-4{)s%#I3>2k-o>>Gzv=t=j&Z8h;St;A|2xL^g{z6ZG zHE+M~hT%6yrz{-dS12ov+I1`OhR^l_N9HGTxw9{}>l4Tz)aTZ_y^fZjZm#~jx|EhO zT!|Iy#J}BZkQX62&RTptgaf-nM|Q$QYN1Py-@E1oD$e(8)_mgP4d z==UEdlR0A9Ea}=Nz$p%ejSz$OQS|B|3S%)S*64`x5jO9A&D3l2ZYgS`d>}~qP!D07 zhT3YxHbO%KmiF1ahdEw4B%Wok91(X!B}m#so4j7Op`RHLyN1@hcZHuhK}m&BHxq?v zNQp5!$Pzd`>?g(02wzerEXni6^(Ct=rSH6P`d$VU=M*du>D!baQd^@7aPhUXx%Mm>4q9m)fBi}-X&(gV2FHjz4}ZA8n66g+-uIxa^tIR7Y_#ho3D{qCHA$M% zI{b^jgb!0+`3+u_#w_W-M%y3LE$148TtMoO_nvJu3M<}bcNPcEinDYLxQ z<5y^wA2+VQg-R}bk%7CgjCr`#F8KlzBvFZ_WE|*MXjZnM#1Bg7tO#%_@EQCL(3f8N zEq1P$3a5;{TFkGoh@2vK>&OJ&%M@SyDmPz1ocH&d*T0X(^7&t*OS7)2k|e=#$i38$ zwA8dw-V6-h+kS;u#+47Dgr;zxelC-r0t`{R_NMj#`LgjV&jdb$DK3F_^FZ4OX(GQu zC<#sA15d+AbT-sD?375w(}t?|FIRS}O|$w;ri4~Ov$of|gFI)Y_0KWIX@D=)t8caL zydRXjz#yN&lsMPHU6EfQ(D-4=UE~@PluQG?S=*15%m5dP!b6PJ-4e)$`WAYxj$fhM zf|4sNjr;5inZgWepDS-hK7*&8rNd+_?KQ9Sa#sDI$FC5T+(+YGT0Q`aT^a~eWWhNI>u?t9Vk6)pA__%f*O8oqVFR_!z zlh>&4D0k6V7S>**3v&Rhi6Eh;(N?SD6y??TtTHlqrza!7LQkt(mAfzd{GlPf)_6oR~#F^cma>XlB>N+)~Vb zxy!5LSIEz=XM#|URZ-as11<@0o|6x8R3K}iOcbbSUB;K^!LLW6gq?N`_-5tpAr zC4Nv6WPKHvA{vrJuu1DGv2a(bnEQ9)eub`DGY{@CB<|7YGtxvUYst)!m zjD!TyYy~unX*3-^zc3o5uJ5D1V5d(}LdrTwQIt|WFb?hwp~(c~nf2_eIPYr18-Yd@JBn+b^Ae zA@wk@{Pwp%EPRwTZzp@|nbfnw@>^*%nNLlFVPq*wpO|FUrpYOZ$Z|MK?SJ!6G0)_R z1q!F1dglDxM1H;8Ep+WP+g?U^d7Pi>1^z6kY%S(v5?C&<=; zArl{7z5AwT>%QlBYKXOZWiSuTv5Hlbln#LW+4|5Ar45K~%5QGpZyYvQ` zN1F$kk4t5P0|fY(wsmr_0h*DGb75V*kC5mUCN^?h;xu*5lVno z-Mr$X?1ZjoG^M#UGtGZOeRQ?MC%3qUj(zXGALgJ$ITnMQsY{h!C`ldiC6-v96yMpJ|KacqzkS8p(d`F;Y1Wttlw zq09h-Y0!wmvx1$RA@~B7#hC&24dduz-QJU#z89tA@-tA2Ki-?RZ^sBg z$8*Gl*go?mC!W3}E-aC;h~B>M8^vYSA1CRI$A+#@2@8riY`)Qj#wY@+(X?f#?ZHl{^THQS}^! z!0UOQEh}j*R)g~xrkpzY{ilhJ){K&oVVPW>RTN9t9H=_7g|ZTzK~p$|6M?;qpGgKZ z^;0W^4KNSuEyFvs6ovZo9KCy17)}7uXoB`(qN5dm;F}K1JUC>g{d;B*4KE2@>HNZ<8zh{tVj3)JrlzH6sqf(gB|Y`|?DTAE9}e@a>-bNN z;eR(i4K+12`}=>$&IMsJgDWR+%Tp8crM$>7;%rGaTq0LkURz@D^dziYQS6}^r{oxX z0QStVOv82voH&)sasv#8c!q9R4nYv7@)1pci6Svg+o7`L{8HZV5|BnDuq=V`B*vbd zuirc%IC1j#UMq6MER7Y~&VbC4qSBS=G z$FGnQ0#8FK@-%cUTUTYr7#3$(n&gW{Z3o6Xzj%qu<+2jZ5u9YV$~Xxn z&kzaUx-Rw#GAg3XjKaz#BJgiT9)cmCwx=Qd3p4~lO+WpG49#1KBc7yRAwh{N&xjMq zM1kZbs~&m?evag`K}inz3{tdo`h~D0hJQM9oz&x380HKON}fk09X?QUIx1<)55}?t z{2?blN_1r84=A3vEEe+lJSF7vcJmNJxiy~)6aT?{Yd6b5$+Nww0NcYK>e=I0h*~VX zYwdEIPnflnmin@7c3AcM6-FflDXpRs&o=m((^h>O1qQ$HS|HCU5Qfecdi)BzCFh|e zkL1Uv(3(Qf!rF_DDQCQ{%@a-IG!3*A!AfQW`CW1|>zpVG0>uh~qXoGU=hpGS0}e;N zehuX7H@{A_eFl5y50<_YdX z{)v39kco1A)*=r0gq%g=~syO#7Z*plBIKTUq2vb0EN?m z{GiO0bsVRJ`7=T`o6Ays79=X+A=s`@+-I;?Bb!Fkci;syN)hnrd zMk}o-TAZB`S0@RcvK?DBG|zJZQO!>j1eQ+4_LlAF@Sp3#f3PYCnca~}P@)(*a6YnJ zw`H6CZl6zz2K5e22_!X4gNR{y66L`|Qs{YA$9DTRWH36LKE?#ksu|`^qvcq=`lktr zndkYI>(^~`>Vv{DB!gXzm$d=82#7q52hMcR!ir}3eL=Hm%%7f_`PVuFg&{!VPl=r>Jct2+LPBZ*Ohep;a`;py!(rt>JEHZ`sz-_CaAxN?}U!i07 zFd<0Fz}avt%X|B^YgfCjcAe~R6NQPDHQn^omg4HFS?|1;pZ3_^l!cvNV5OytGabhT ztG4g<<(Gt-@N+9vw!kt3et1uH{Cg0L{+;S~raLPh&K)FxQEH~Yg zuh8i6D?~IiO972<%gwlPdbd7^W;w=ZGjhKj=-ij?3`j(LhUF`S_Tgqubd2S-y@&m- zkpT_x2^1c3NrZ&@RN2_BUHMruM;>A* zIGm)HW44ahYnVBVet%=D*>=005Ltd zsn%+J>jlS7EfG9wL*JAcyWY*4*_W?yNcEz8h1nuXFWAmk*i-$0=2T=X->Pgfn90>}_nyip?nOuiImK7A%`|}3MmKSQ1v^V_a=yp4+bHjNX&4J2LSeQ9 z|F$ZPt_C9FLvvGe9T#7i>q>Kz^6q2zh!_jG;?FO|Gd7?AP6PO4hVm&sb&8$Mc3zFd zGa`%S#9q8?+D=o|TbiyIrq_330xNM&%wdW10Kcg;#RpY7Uh>5A>RbkM@17E_+EFHgYfn zA3mRr=WIfJY6(7sK+Z`MGxG&_rD>9QcoIfgp3G&4stq4WSozTeQwn$=S3PR!qgBnU~&<5)M(rkC+ra>I%B1&I?< zHjl>+34lh|Tl3QsJkNrhD2fRqrF`vS`TCl5p?BWU*o|;7mF+nJYj!&W=&@8RQ z!%rZZ&4+E8FvI}RoXm9j0F5I*e&F_DENDYvX+B8Nm{Kj0B=eIq$^P;hhX+m!VU(7*Kc1s)-e_Z^aWNJKKyUd1h9^RSXq(sL z7z@x<{`}`L9CoIetjNHmp~4pC+s-6S%eKngK8?bgRU7XBWZP(=$g&D!DqH~yq`?JB)`BA+j%(pYK0(RN&xqB@mVO>OIkKdC=> z#4Jpg_$-;kUciUIa6OjxD@U^wPFS9AdwxrY|D#2hAc@xPgZg*>wRZhuvbZKL7olAx zr05B5cWl(o6z*tNPdD}Vl)2sN@X0O}@Sc2Fz>vmltqahzlX(uMW@ZaG4$rGq)OuBe zF{V7a*}U=teft(6cf);kapcZCXWW!`KK9gGB;OWBcInn|~r-xk}BRC`?W!XxeJ`{c4RQ zaDitD61Qzvm@YWFY19&xG|OAncfX@8#ty@><{8C|Y z9u|+@{vrrd*SZ?+LXo6t+x6fD)x!qzw};lD8THXk`Q}^3-aUesU{8#Zw2;e&(}k%S zs09hiQCmI7fBh$LcJn~K^|rBppWq~Z;WXZP_vi=`$4KDQ?A$CaoeuSOJV#R~kP4=m zHcm3?=1uwbPmO~I1eb+9F~N4*kYX546kyk9wQAVFFprVNj9J^OU-^-?eTNisfM%i$ zQ5_<9FN(IBwNB)2kX0f<6G#|I%NsZASKrXK?~;5D5D&?TSPGwN{Om97AkVkz`}ONT z)^_fZyacF-41-B_S}5XEX`3x&goRT*XN$qJSdg6h&9}AP`y|)l6BERcPovUzBI!H2 zLJ9ef{Fs%k%DdlIHm*`)v2cE!ip}%U%k!jJ?GAzL$r+MnVe$cluI*GoevpXJEcBPM z@sU}1468o3bPlID9;6h>4{qru%1};Gj#3?A@D%v^DH|V~)h$@9`K9x~E&1*Qj0;EZ zDmb$%7sK;(*nknpfB`d254F$Zo9d%0R&^UV2fquA2upu9*mxg9RHb$NT zS*>dG-iP|(W5j1YjSqUS{hM&Ys3- z0Wd}+KZXg*Aj}C)t9+#T0H1iw?eL(uhfn8-kYSiG-){n!cM9fSoc3PLE$s$WLBu*ud@TjyCJt(aF*|%M#4u9}r5KZbsUC(Q3s@LAm?!Wn- zTR()q{U5(ar=`$_!uXJ*0vaf3>ZaT7DT-oRKmOA&ry+bG2-5X^GdMUCXo?RaZxIAJ z4jPX0!HJYt=qaRwQ#KC6gg~1Z3>?3m(@=*$_z=lq8$qE+X`-+`| z>S3h;FpCM|Y)wCZnxD+Y$r{(*?BpUGkgqT?q)9#{>Nm=1c;l^z&-J(CG@aQm!6$~X z02!&<`+gg9SKj%Kr^%kCzz2$9`+JmP6A*_Ab7K0wa?tRC9B^TdJoUjxQ4YZe9}>KP z0v{toD2x+%mghpVl2j9`9*m`KwE1j&)J8K2;@Hau!jLTlQbe$UhYD;zd=Cq98eTzs zECZIw_AOY)J|ojjKA0JdvCt&hy8C`8hpjvB56V}VtWT~#&N~#g?uI!Hb@*NrWO4`n?b`HT?fOudMu!B@Ku&gkF zcTtpvVR)JlETiq*Zu7Yft93seAtc@_45LNDyiKEt(REiHuD~!trC-5PBNHGudPb5D)7s-!UIBI=T zt+!M80JI{5`KO~-!!t)kH-o8Q!pat-*&&EPGpgP+btL}Bu4Mo4W6#c#rS8JBDsih4 z+f5qkI1l#95BDni&@@A-*F>Pbn_%dpSL?_j{~gzBs#@OxqCfQ2W4C*rYz7IuQWlgh zAGIB&v&eBYPK?R?7@dSpHroS6@3RK$_n+$3vh;rexO`@|^F#jh8MaUiT^KDF>8@ZF z{S;m?Bl>HjcBc$N z8autAKVr;{!dQIiMD*`3{33|aLB9y{N*(vnf z*ey4i4~>~T*GtI&jWTKI$xRHZP3k%0@b%e=r_pG;Qak#%2dnhz6j2PqY6muCYdLOS z=;EP0-Msa9zo{O<6wYqjqGc(P4j_U^kyz4H!cMbSgTm75uM=X9kP4;Ozdnd&*d*n7 z4Mo*0bLN%L5rs)&Vru4<7p=5o=}uud(KK|UVpv3SRN1yEz4ALam&3C;=?lN(2I>vX zw!L6+!ZB=85HdrJ3OnqiFZ?zxNVtIbcy7uo^c1>|Riq<$I{O|nZi5FfWrxzA3uIR4!NmaGIgzJ;zB+fm1zIFKx44ScVqZsmtBSL%EBuz)K;^j|;CjL0S*2SICw4 zJ2~CdA2AwD$zAwjo6i>mnqG|6z7b0Wa7d5!c*m+YCO-F7oELFES97Nc0`GV$c)&=v&tT48!`495#orHrj(W56bHnC{`Q2vNItsJ zKi>mQcI_FQW^kI9)-KyhJ!Srp8$&Rb=UB?#eXCi{pL>;Hd6E?h7hbbsc5mHXYwUa( z$eiouZe-nyf; z`s?GW&G-uF%2l4H+hK_O&>YilR*-`sN#i8L&8@pyBR+yc4Z7W`j)Sqp<#VAN!UtQf zrL=RamPi*U*RT|ts(Diejv1=}{sTkMx4*HGCN8sqTar$zWX9AGm zXZ+2Uyw|Ar)5MVB@r~Tm>VR_$%}_Kpz{tH87`dZ()0U+pr4%L!$o{NqhIw|8A#=T6 zjTyP4K$?638PG@!lMjxBKy>PI{jjFErZ+w&9%DIZ_9hl z=EK`@P#zh%C*;SKw;uKMd$c2?N$!Q!Oj{*(dU=*-qK@7>tT`UlQ=dkPk$WMYGspA2 zmeNSjq#3y*LwL8F9EKq90GB{$zcVWfupzcAo7Fbzyuh|?5P$Wh4N1rLner&IG424S>hqXvsN zo?Si#&uTUGFkf$AG<_ZQSKCq@rzma~)mg}i*#gpS`>qRpTHoJu`$L2cws}WJ?z5|z zxc1a@wB3iD_JMh}Ff*M$`BZ3ttm~F;IH*2%ue1%2y^s$#yB5;GlvSFWMn>F^K5-4B zuPVcA-qZ6HZrpT@UIX@s#%~**cXJxH`K+GrH7~-@MdI0sz)*-ZvbP72oD2f@) zKd#-l@oto}FXYK^{L(p)M?NbGxokvp=Y!VaVZyZ8AF3($k#Rb|d_HdE?jd9O>&PK7 zlpg|9S0vsUGB&@IFH#5yx!(N!pr(4v4sCb+<@ z-SZl@jpMjt8XcFzkOmK~P%ouuO3$;#p&3>O$1yBqPzB4N>AC>92nI zwiH-=94BxG^lit&5dm&Pd)j8J*>JUZNHz=w6|`)e0s^0-DA$Gh$bd6=mU0Pnff%m5+uJK^Me_Ys#48jZu63MeFtNS|XheAc0eXX#TW-LM`vjq?rq!$|k8Z`#0~StWuG-2V zJ`~Gym}96r50Q*vnX%6bu@FkyaxG8*pmv7msyp}5v*NK~LmDceL17vi%J%)<`T$L< z9?^t+w(ohSkv@+NJ}ZP}!)}GoVgf#Ob?a{Dy|7MwLK_(7>-6y^D_#xd|&eRRvSG@7BIC%bFpsI$U0pQtY!wPEhw zjlw+yiYP%6Vac=`WoST*V04%$>xc6Fk7Fx(;920>j)M9fBN>KcF-uk+-Do5D;n7Yz zdgA~}I=0m;2MR3)$!)8mY+P?YD-u0K1NEU90@-x-&_rYb%^^}iQf$DdoTN$AeOQ#$ zkPp;{4)`=H%EPPUpdx}1#M#pw#}kyqXzu~kw#}zJCZ7TIVaMU)qp8Rp@RRMxRh(oz zz}O4}pMejcBAN#I@rK8DNaYiZQ_qoW`p)eRx}qpb5CyxvF@U|O8Ej~$v)*_bEOavB z=|Nmw*9qg_pllDEK>Eso^XTUkMHZgS!P zEK|7r+OUj)AN>dmvJ(=8MOn5r9p-}|iX(;d9FfgZZhb4tV3?YD5XZR7Crn$d{29uu zH~;Vc&gC=fcpG)@R2v8N2p8&dBcv&P?R74j9-cH#L-4t#?b5lD7i>d30J$)DX)L7MBCCGp&o_-0>%>;4?bGgSC3JeE3Q!<++wR<1zzVS_< znS1pg<<5RCIQ}8n7uQ1D5`Z;lSLR@~*}l1fb_%fU^ITK)vtFs)P_ppv|JQ|QPNlbVxl#KI)Xv4Pyv|Lg%SQdfJKO*2pCLZK_g@yCLy1jR7N#kJ zGy{#@<2SA;J5`it@amgrAUypgJU_1}j;_NxgX#k)g5yX*B=v_M?!EObD4G4j*QNF6 zQ-l1V42IW(42BoJ81d0yJ@MLn2od;fe6;uWx8dg5UwK_R{amUZ%dBiSZlElOx$|GZ zb8{-HPsqnd>CZSq5J=+JRLq6XlJ9-I|IYUu&&!^BgiY$2kOI*0zQ{9p=9WeWx+z}g-Su1!dQ;9 z4sNTTybb%c=@)(@8ze-6t5s{-G297!v_~k99)IEzE|v_#u}qX^gp(v#rx_MU@3ndD z;C+-)ar%W{50kp|>#^eb3UO&tQ(Xf#E>75A7|Rg6Kp0!s4?g%C#OJv$XIC!vzEr?2 znXhm*lNMB6-neo2A>uRj>}%qQ^QjsmtG?g5`}2U$b9i=2)c_MmYC$qc=O^%_vHi*6 z$8P}tsmrel%YDhsg1uinUm@_(GzU3L2YjGm(R*>Ev2&|@1p#|zdAFW>`HG^y|2DPKb}HhJ-jB1%Byht?``EL@_4f;ruSpSXpy-K>Iv##+o} z!?selJ}F=SDJ+p78|?IIsvZkv9^4MH6E2*=xgzwt4IAI!yJsRehvwd<0vl z$@4FViHuOb`gHUxx;21*@FvQG*`;|}LMSPz6oG^PTRo5KLS9lI(=u1;fsk`?p zw~?%t&U{Yjtm8>NRy^|{E);b@#X-o7s6I4~QmLx7Vc7|h`s$o-8jTxh&CQ?xRd#aO z*6Yn+*e0w~j+l9{w>}`x6b|i->eI&ugkF)mTF*fl14)t;vO@e>uv;c3R!KgWeoPtT zgL64pbWp#CrZPB2kvPNPB!ROWO9wDUuI@%aMMvWhK8&To0)}$aY}H|N?snpQ!w1{; z9gni^y~+3{3b0t&$*!RZ4)&-$=Ix#AgjQp(lfjT62{GUG!z{o3EicHq2DALYjDd&- zWelurK32tbq#J4r`0;&t?t&-Kbla^7c2=tGmo5M9fAOEW^?lDUg!)~%#=}H`}6VwUBivSzXU(;Dp*|FBYei13qlrM>+;L>IWocgdewY=mb+BV{ zs}^!j^>G4+3C=@%1y^o4yMOV|Gmhaqj=Fts^7(%&=<6a`6vAp1b7E1-KDhqCIoN4_ za&6Z=T9D%K>x_f`~uiAVbPF#AmtsW*3tvF+SJk`u2ZKv#XC73lhbFUx!sYrtiWR}}zz4)hRh@&k{upyn7B+4FQStoe zQ}tM#e1-M>U4vVN)e+Ul56_zrA5C))e)4ZH$I7^_cJR1(?xo(B3fLv{6|P4~OOn_2 z5C7N=a?(kCoSU=b|*kvo6{iFJ1;446-gLl7~LD}UT{cyW@_64k8 zvEg^~6*dkJbapWqUy(;Z$Vb(j@_XOHT$B|~FK-tR&`;50b@CN9%7<+}VSgd{L40(# z^1-(=A)m@lVg1=Cpag-#hP)HdM|t>BlvPlvGo_{YAtQ3F4ctU_fBI)gcMB5QD(BZO zMXIc%9!q@~WhYb{HH)5stwP5p7CwN)IX)x&96NZtd6D?H$X(02e0@+ zpQ=s72OvJY7D~FsuuvmdbYY)g`S>qz*GBJE-OHc6l%mJNGR-?tcEV=0VlcC|(+#Hx zAK)wSsb2j)ET*VFwf+3bi>bQiSiZs_gJGKK{@w?F8D{a*>-+f*&_|Nf)nj!s54NgR zlbN-g2tBlw_nvNeGN4Z%WnE0oPDsFlH@jYW|66X5UlL_~U3mt^m900tWI){`WgcwR zDyTkotUg{)AJdZ`eT1?mCHdeuZo~T3CLWYA5Q#O00nF+=3-f)}oj|S+6 zo_gPibY9 zDMZi}#?*GXKFGdd_>0u*j-pyY17=fp5|(R3Is5!E`J`*_EO=}0Q}GGX))}^|hGtL6 zSgE{74Yj0-=5(cIn!U$58Hr&^Q@mJYNG8Q$LTx#QX2s1%a2lsUc9wXy$XHHBGrC=F zI8MEsuIyFOhNc^fo=Sw|@L_h)Z4|7iOE8=72zM!;ZI3Z`WkitCt@$@dge!?7l3+>an&LB(XSET5&RA(oFZwS=ko=M7i=%1J8enDkm-XatH~3YE*~U6h%hkVV-r!D>~1^v zH%#KJP}W_;4CN5-X+?Av+-aZmGz*?La|8KirOac9j~zBMdVeYzpT+64 zv!5C6)u@=BX?y9uWgx)NKCa*2%L7KfAD62!tzmn(s!$)tP0dOOg-{>O9JucAlP6OB zhWW|WWBWj=7SzW}%K{nNz<8RKGV9Xg`Rp6IVcT|cUx0z+WOG@TV^bXxQNO#1`k=iT z!?I$Qq#2kh>n+Rg9`rf!v%3g}h8irpv<9;zjdDzou%&>D&6nhsWf>ldFi4UF!_XWD z(25oWq8;CoKsnBKG6XaI!fQUox2ny4X$Z3u;v|(l^D+@+M zJj`GFga4MBE{^0wiN>X=yEI4e%NJW$-z7L^`Sl zwD7`jQ+bgPNk*cX37W~%Buj+$fMo8ZcK-vM=GXqDjQ`de6)cxeDOEGMhOFCW9qDO>pg;D7k}@+;^s@C zFk7}gkSH8}c=2I~iDdwv?Tb4)i zCtt?dbUp;|DFYvR@&BXly@Msm@B6UnoVzE!d2!$7c(>tpFXAFVfCP*{3Lqtmv{|;K zvR$;wE>-ytiXtVFl2u~qPsuJ-*;3IWO_(A`f+7JBI2`T{xVQ&w-rF4BzWm_tejPpGz&TWxEw-U!mSK=I#mKU@j^3;K{1<=@(rm#^ zfrD)hNFmKTY-7CC+1YeFl3hFldjd&O6wATpLvbA1f5K{Rys^6ibQYff8C)!Po1Ia? zir|FK?zZC+^xTuUpKTI@eig;&y8#_Np!4icGsW3ajD_;_@^WKy-E;|d&pDhGhb}f) z%q7LBKgyBh!ZV*^iq+IJmK2ip3i}TkvQBY=wgvoG>dk)Gj~yDOxEb%>+dPN<-%tNd`Wwz;m}*bKsdXM@UwLIYXi&jHOT>NHRRX7}jiV z!n3L;U%gS@JfYY2$hpImDf^WJ?=^ug@5UH=`k^U7`eXXIhJAdNSL5ebX3rlUemL6GOQ&k>p*K3HM znIn_=*&C~t2nc0>Y$j9;v}~Ac6fZ^j2{c=P(%>Tf`2$A`+*eyo2j)oW0PqHLhD4hb z3$qA0qxVNYKwk`vYu%=y$8?`DAFTTFs|o1@x^I0=n<|MBhLwxB-t8oSXBLX(Wl>PX zi9%X}hH1L%YpUl>rVoEuSm0@TC>LTB!9Tr!AeAka3p0JK##W=fR%?C&tPP^Z!?h3& zEBnh7MP~zNwdC{|0-H!@;%9k*0y?mJ2!Lh$1f+xdiPO^Y#ixKy%C@}EBvMsl^qesV`<~c?X zQU`v1frD{pk1XW(&jtJ}$qdEQAZ6$|?|bjA7%gL>9uWFv&pwjEu}_v{EoJXO{e$Wi zK2essmfZp|%CfJ1{fDb7-M*~vWecAu55n9$M^SjXuZiVuY-paB9ZS_$w8P?_n?rPP zn&C$36$W$?)dojMx`Eg?JIf+|B8|1K8fuTcH0e1aBV(8+<|UM(Wmsd8;VW~bFQQnz zj<&t-`21{bX`{02&?_q9;#|z*daoNcj{gD>ZL@AfWptY5d<|&IysXZk;s~g&-^?N< z%DxLuTiaT7OdavFt)*$$-Nfrc|IAbvf4sbmndW8u#ZA47#%rWrp=G-}XkB<&^rQ2+ z0{oCMej;MGyS-!N+{_Tg=pSav3>-l5nucM$LPTfRm|%qnl)lhEB|tebZ5se|P1VM( zg5moJqJaE&`x6`SGk;)MKXLso;>YrK>PEVnc|@6;7jZ+^M&=Ltt>bvDwmH1%p#lIT z3aL(c$8wP&33N8|3kSj)f}OgG0w7e|_I4Xa&P)6*oxO4a`WZ_d&D{73L1}**saJU0 zF}glKrZ>g;4v4Ijr^xtuAe9xUs zXUd1dX`L4pnxq548ot0k;pVh-d|P2_B#oy?Q#gT5vDW;I2D^Hv??>$OlLu^%`5*WK z|Ad=uvv0AQlxfe{H8!rRX#S+N)YOFEL<_MC- zaw|O}L|3^9;i~Yoz|j3y&h_WdJ)BS^)IWgtYnmxhw3L_k9)X)#mfWGVj)zmrP}SXydRAZRdMqCVymLP# zJw7@$d#dfHU^q_8eSYMi01?|m0k)~;7(8Jvg#PKNPO6nB+8yb6FR{_nky8$wq~&6t zpQ3!=Nw}%1PWI-Xv=ypDev(5PvWjO-_ShewaZs-i>5Wh@F9BcVL#N?p|CPtagJYqs zu&3FHlyxX5567pGwBdbvou1YUV>Ss!ln~318r!Nd16R^4|DNq2Vc@>GfJ` zc=p9-yJ0x-3d|^iFl)`iLkW&ojy_H2XF`7RGs@9t2$mmuwqS|LlfoWqoEXj2GY-K@SON7)ZLMbqqwq)|9`r{mhTL*Y`!S(SKcAupvb zq|6_O|EFrsH1xyX88r4=kd>k7q$CT2$ieMK$8|rUoz{mzv0vQ8x!c@Ikn^ExFigh^K`Rj7>`hK z8@MCC^7G7+lD2mvv8Puz4bD+SM&hN!%!YpgKMmmLb;OVG;#cWKIaO41bVuJcT+?+} zOvw=g{1-d(w%62qC?ba0^E4sP(L%p`UfS%3Nh>VP<6**dOr{CSA8Q3C9$emP{?Wfh z{Jij0YF$(%CjO_lrBy?LH3q=urgo@uCIOj(Zdhv-9 z64APYV{z3zL4u+I6_n#6{{kN*2cQy$N%M>2R}qBZ-&%83O#w?d{$8Zto%LXJ+9f zDOJ*zP9I}=z>k}gV$&3aA)e=Z-JadqRo76Y7{73w49r_2Q_%NSKw*Kr$cyv){Deu- z@glkT{i`?sviIl;;%DvzDV9=Kmg_hs%3|ucBo=!>WVY+AS`bY}R}SJ_fo53LA0zF; zv(|9=`2!eACK9#glKlL^wOilmt)l2ZcJ4SKlwuxuBb%dXxhd@W|A|Hs`c-k#n+^A$ zg@ah44lMAqaB%I;cY1z5Gu0!6P@EtGo312~gBit@mnVv!d}VLz;l=2DoA`*wFdrd) zlIIu8v)a_@!42K8Ejx7G`=tE9%&`m|#U$f6ovqMFfr!59cwDEz)~2`HTBG6m8A~18 zo1lscZNn5RaF2mvB6=*_awpP{m|BO8agN4?p%Z1XKQaKVcH7-gteFTiDU>IuuLc4> zkx@0N`Mqy=S_`i355FalEl%+Zl3o__s1LGIpt-!q|qH0{CplvVFIMz^Q6 zT4?{la*pd}iSqjDB@acI>gL83!gtjfvj@Ua8(0PtY641By7$iq^H6{IlZ>&#BmL}U z>5~9mg|!H8ew3kfi0QGCr4k4HJholoce}3ded{&mKvwg=yk*bEda|b5~!q5Jn%SbF|J6>2r zFj2=-E&;moY!fbhriVH5?5 z5m06){)7^W)F1=G6uKqnaWoyNjcJ-5pV)omrBHqcwWp@0(HhSW3XIh>L+u6g$IV8N zA-3%{J2XpEG#zFm^}N*8fih1T1}sJ=?u|du=7RY$il5Eddpz6AP>(eMhGmsuBZ@<; z%TOfWk2q*_RmXko@_$KCB1zLUgNd2vg<7XG9uVjLdOn}rcSsSKb$rSf3Z)qXq(IlB zaGWJ@ErIN6c~;N1yS9_i@#2$VKZa70%E@zLWM&h>5P-^bxZX6|aR!xDTyI3R zlWxiwXmGG8@-$ER>DsPD6Q1Xx*b#<9Sqi-<{R}-;LZ6h>W5q{3P2!Ijh_Fdr=;cPl z`2SQ~g$iyNwrOh=iM)_$Du{lFcShvFDEitoZPV=UKYhNi zT)HS9e^W*jGx`|M7|qm?_rjORqJyRJgN?eoc!T>B^;l!5q>pv{7b%M}uE&b0t1^xj zEZ}OQ$t~7-8I0k>K99B#B%zLF)L6`z)t2Shu0fDEO(F;PG&|AYeDKixv2BzQYap_C zN${Gc#|ozt9SvSiZHMJ1?kyP&VlxoKa#4kB#;o>oWAxtGl;^;hK}tPNF|M-Q-ybI( zj+MQZuhg7gk2U2d)4f~ZyX~&`I1jQ+3$DP09YxrTHLv+8?k$uFEsn{?0Gcq0utv6|XuR9gN||L=g@FB8Qb_h8U^1Y}r-=pVc4T!x>h5@vB);a#1>Yfk-n3V9esd_RX8X zkNoo2$Z`CHo&gj`69kE>zqzhzySnRINKa!l^s4^omPgXunV)k>%4%6=9qw9=YI`I4 zPJ+S2B0=UnPU=SyuB_R9wI##hZ4_BUDaT(;sj?p5PbnIoeQHlogq6Us{R$WSd9A14 zS4;Y%yEx4X&wq`K_D|YOq*+XniRfG%w4xUFp(sLDD1PDRD4v}x$$?ZAQPIQURpcnu zcD8fJJ2yXcER#R@DV&qXyI4>ZE=g3%%E5A)Bbbd1oS;z@;UF3@LyrahQz**>&BkPK zEN7{mcFVFFn;1!P2c8e35wrDJaFX@;iFvNT_CyIvZ)X)JC~^Nef)i6-Djruz3If6M zeySTsM`6?`yQ$W!wd<zzi&?x22V7M>hN5oT=leSWY+VgrEJBr9l*Z9j_e7@mkYOPke{ zsK7MyTo0xV0^We19M@=UcXk_Aw+QN7)0F+xWg$zGAZ1nsJ9Jxr0Wr>t60hWf# zIBFC45f+~yc`4(Z$NK$)$>jpU3W)|*YqwKx13xIbEsP?}r75Mo0Ue$rQ`?}3ym%Dh zcs&-(H-b%ul%c%&wU*Uu_|bMKig5gSOb{rQcg`<}B+Z|g^7Mv1$?Vo#+n7d=r5mn0 zH84VWgC){{AcoRnS=Qs8=C11k+6hYBIQ~aRLb(G|1+Wy%8Q69#(?ChC{W>Vga}$na zFX_}3L=loBx>MJ5eE(%$HM-W6PHGH2K{dxqJUuY(Aj$2q^;j^#Ez=tRs{v7#8}frk zN)1XpGk~Jqse=yE-$=$>L7cL&ggo#tMd0h5q){^eL_Rn3cc)gEVXCfDB9*8!2siUj z6mm2F?euiA{*+%TWk`5JbulN*qR2r}%oMNs1o=FdBV8KDOxKg>&}kp0`9`OM`ltMN(xt}{367KT zQ5i32#g&zXU;b~VpC_u`BT+X&8pcZoU-A!qJIVa91RRF?LPViQ=F?j|CMw-Q<@%2+gkDYA)~ep zxGBucdwgXIeVe~Ovt-uV5i4^!zA`FlrRuR5=%39MO3Wwf-)Wl1bdi;|0jx^;k^97}KBxr(zAIe#|Xe+*;1#%CC! zJJOYGzMNwUBt!eL5pK2?%1`J;kQ_72?J#Zp4gGti1--q z4xSB5Eyld69#3H?0;<3!|0-BSzIYu7$OJ|Y=a$ef_uDf}_phe0oDo=>W~Xdi_P1-9 z2JKM2XA{ zpNUKS&`K0Z*fu(k?pfV72xq7yL$}>oxeGTXk&Lv*vc&Y@Z}8AWuvN4%FAEIEPUz^q zhybEu>(*7XRRf#{m)WkhZe50(KBi3V_Z0IR+gDMKOgZ=yL9q;#%QzwzrY<+Yu~$Sw(EU<>hMq3&;@}=8~5}_ z@;s4c*5L&*og+NuZ3UhHemZw9o2}iDpVn^s&PB&i1@wq9^Dx%YLQFk_C%ES&v3&Sh zHkrpVeO5bquX*i#v#|xZ0p-VUY&EZ;YR4=?B!8Xho`|t&02B+cAkjxxxlG@M{{QnV z9cjN`y zPetgLVvTh%h+oYMe#OA2K0UtjV6+WQ?X5=% zex|1L$D%+4bYk!Im9KE}@ZA-bL4{~K$S7;Bwwkf(gt#g38Q2ZwU;@4Wlj_(DsfZoe)tgCl_#L>9R zez6^?_n327zUrYG##`#W3rOL;?+m3>{oRS9 z1*Y4x2V%b6-q3x=d3NtPQl5kRc56d__z~)7_EWjiykqM1%Wt=Dd;k+kKKg8sQk9|z zSb&Jmpr6~D@GE~m1UgmJ&v0ku$1DYOUdZ`%293r>`v%$*# zY8T&%+?n--W&$u)m@gxM8l7$J5mJb9OQ#7xuF&pm>yIw76y~wd<_fcbv0#60-$p$z zA394H0y;P^P`%zzW9|P6_46RE5Zzh3%)omw=W>NA@YA^TcI%E`3Gu*FbRirsz@R9Z zMPG2WyW9FIisNG!pCmJ>u)>sC8=>#RF31 zLj;GEH;&e@c5YK7=F!JucmKa zXGq+opUf$UGT_&K1;Zz3rJUlAl@?bRuUA+Gj8(hv{qBl?XAim)SRpyYPh|e64Pz6% zJ5xP^N8$>hS&(#!EAKICu-?D#ulLWelzwd0nB1}R)K>mjszPQ-hd?m zNZ*H0>1rhS6HHUM0+Q?|=CE^N!AOUnRqj@FlG58YF zL3hGFDHLcfVp|7v754MJFs@L$_nuEjZ~34K(Yf}+V4XIvz7v<6b8P2&B1lRMF(3)(Dxl-TEI&E^`eocRD9r5L|4D#c z09~ONJxf#XU+_(1jGUMAd4^>M9(6fDR{Bv4XPD=vlXa5>meX;|Lv!iO>Ob zm53_@bOrsx!F$~a>-fSKRDTiZ+#Oc-l_d((T7P zX>7o#P2Tsu0@4Rryuyw4VMtt3sOmzj79ob?+{{AaS-|gnp2}D7EPgF@$kEKH^|z*u>X6$;eo&`vpYSQYdBE3UQDQDM=>rbjt2v{`lk0N^P zC{|#rVPY75w!+W*N=?@@Olx5Dn6Hq^43Vzs$5H>}3qEAd>YfRaRMjir68uSTxLa)OdC1$Ht=3j*gvD`O1gE?0^{3Ku`JgafhDli^^S$}N0>c;s+aip=1)G)@qB9e#%$wQw0}@22Ew4}^BJQ^ zw8XNM4-Cife$8BHQOMH*Phc5#IEKUp22VF+d$Ap+pwPa#Hq}z;_s@_Ye5~C+vdl)} z3e$QcJscws{BVi+(@&a*(kqe$IaDEVr9D{8%Ir;HD-3razOp=d+yZ{&QGSLCHOkL4 zA70?6EOVLF)2L(slgST5lbNfg{|TcA8)P-HDi}YX2a0WG36>-LEZvgT-o{BrIPff= zFUTP83RL3J1g}`A@*p$!?B}FvdMbTNDj2(~&?bN8wV>X@=!A<^ClvG1H4JhIFOX;& zGI_JU4#-+L@v1UYDwTsXCT@=1v&ZT+aRyZt1X;GwFEU+g_so7WpD8O34%!HUSn6kI zfTt-0mZvd{#PG#gb)|&~%IxQ#sVLMki&YO)dQFXxq=mC57{9g*Q!N@gZno>CFMcWd zETkBRT};F=E{BQxjYsz|mMeVv=kxoxYM#s=KcGK|ahS#Pcsd23bAKv2!)ZX0%+kTm z?VA{k*DJpe#5t0M1LoSDXry7Rf}zYr`C&zzl~Hb2OxSDg+{0*AdgiO*f~d?B;`||N z<1XA$Uix{UL*zVZ&&$T@Rf3f&XJ2CD8Jp0!^JuPPjAAxm+!^`AD{`e=Dl_n3m{Eo0 zCl37WzsWMFpXKU|P%UUCzI1$_uIYn-2IL>Z;G&FUAQuSxjrDslH}bE2t+1b;DU-^< z1IEJ#ILj5k5Y`!_=Jy&8Vt4w5)yBmYj@BzgcOIgCE`I)JDUp>$A=rHMX4mUNnmx-L>I7`1i(&MW?%A>!jWv@XzIK+9+i5H?&H57++;2f$(iscASwpy^0(Bgr!L5LH<%V7n>{pX@V zSeWkw!=U^hIgAqRE{b>KmQHhuBFYr}*KP-O51$I@aI)Rr#VM+C@fe!~^N^&{! zl>(xpgmex*)u#h}h+-IJpu-9=It+pA45+}QV0UXcMG8x&1Vt_=FcB0BMhD(v|Cu1d z6yC*b@1QsJ?_d~FI{qT=7r8>~jHEEn@@zwgr{jKgLO*VfV1RNX5^0Eq6%28bTRcwC zeDoBgX#j{mrXe{ytWtLbU@07poFLkMgdjhEB%locb>O@p$VV3Pz^ z2mIJZFNT#_ro{Q~4M8o!d)&!{1DZ5-H5Hjssw#CudVn6lv&DG7GZcd406Ses?P;BbXE@H6#51D{0e%=Ro``8&vwNeas2SU z0!3Cy{K}1;JC{DT)n2AtlmLQ~xcJOTX@|AxACBw7JDMm(&M<8%^ze*Q48~eF&Fxm*iuR8;t@ahwBIE?pKQ?U3R1I}` zw&FPG;f*`%8z0_EsD9Jb!TxyhLg~N(RzV0rZ?$W8@7lfY;Ll!q7p0V!f(?T&SNpXH zyQmi7un2spUBgMjb3NB_Q|JsTP=Taz@Gz5Ce5BZ_-M(e_I!R5Q-`KI8ZmVOPW-5mm zMKgsNf-JU^i^n!c9h7`m;gmfA&G0KCA%S1BGn$rjL_qc`gH z8<)*aD@&C>M#Yc#ncdT`McC9f9s)n3?K9VU{|~g3FCIU`7Lnwv*X#9bKQTLvG3`_6 z`D-Iyi?FF}K5+D&m$Lmbu9+RF?Rm6ZD4uwlD`2kYK3 z15+>H68Xq!v04=+)@;=3mp=eWIDIX7R-r{CF`8Yy^YIRh{ulF)Cinq zS(tMBrPc_*ilEVP04oh+fwU*gE-94)-%phe^QN=@(0NRZMNqV~upBL?gXpX!=@1kt z&Q>}b+kVQgwCd$RXMPVUG5m7qmsDmcMPY&pXSY_jy3<8+!s)1p$^fD>1inY&YNlyF zW)LESnFSgPU?1-Uzk zAI-AbP1B9lb^}?KkQ9X=P-Q#c*AMwUb~V*~%p|TfNgh=yPnUTa$KVM+*-*Dy#_FXj zX16m9#+p5ORHzh{S)RhN5=j^MW}u6x&UuhqKucXxm*o?#e@3KZQijv`IfH6yVr zIG$%%mSz|vPA-#;Bvpc#4Zv3QyWyM6yU9D8)WNQuKrU($>MTee#3 z#BIW^*=-w*I?3?!&%K04YNA8`0K7m$zpTIimf3DT7RCa3TH1di9%gT~?_G6tEjK;L z^3lxv3!hH%^UmvL`|&Uq0Ydb_Q;D$u_MJl1-2DoFkc2nPtmWvB7eh!QH#rpZ? z9jin6<2C$A{nmTEP2}}r>LwhMi7bo&Q!afgFYG%F+fd}Ct=|2M?o=2w4zQ4#lOg+4IsjOG6CqX2#oZqQ6XBE?3pSnd z^4`+YJRLE4qO4y8Y4$o(+B<{)6DqSr+*XC?kV!fu3mc(C@tmb<2=b3$ETLQlDHG0o zs=$V}Dw3GzXw~oEW>1?k%c#hSaMlj~S%p)YAV>_;9uq(;vMkd-9Rr;Xa6*#Q&i2~o zAO1h>%a`c=d$SCbWB3V13&-(ReLG5rB9WSnrbyFDFJm;5FGs!p1FmBH>`U@P5d?}q zr!m`cF&6$o(E=^YGN2X$X{)fl9uo1>+1%az!>@NQUL@!Ck|H~CDjh6W4)DyP-$#Jc zc2&pnFjkS9cdqWd{l~q#mk6m4n8`+!~_L=sejPMIQixAX`9*YDLoI&T=}$a|%DbCi!BqfnLW=%T|&j;~+)sP^8U z_3mG$qWzOiO{mVt6KNu;8liOD-f6;qz4G>RYZX5g#wjLIh0z}Yfkh6{{&k}Sjrvq9YB&Dt0?p%9I z-?&ZiawK7Cx(^&Ydg<9ul@}^hB>xCZLV_3SS3hk09R{m!>>HD_G$$6I*nw3}KS#&QP9S~+ zxqkJ%#^txvwcBL0pRufz203BrAQ?|wiB>zsbRS%AUVU3#zXQl1pu^;6U=Dbws!<9S ztUUE19WTs~F9|bC`Sp*kZodA1w6DKQE7d^hLh<75|+ADWlKwi zb5C(IB@%@YlL7Wc`YMj<-MP`a^lfeR8o?KcVLy-Tg}Cn-NZ|WkJ~LO6VO#KHy>Xf% zc%GK_EH>}0HLty;ZQjEflo1z8SyeHz!k(jve57y)3iGqZZmo6Y`|8S7QY@f#f#tYL z0alP}=NvB2scm=e3&kWNyNqJpPO zvlSd2gx<(ccpr>91Nx5ZG5z5urYtz^+lhulPT-;sN~o!SKKO9)T7(LPP!b&E)5I`l z@e{q7pcA|xQg;b_>bA?JSvh0;eDj;B`k0C+?3*vn6eSK7Fb9c|NNv{q_Mf_H)9p0j z%UFdR1^{i2=c+u5k8JClz%|Z)53_aLHPsvMFp>a5Y7R^8{l$GtgVQDO!W&c%UdFLJ zMdmqf>jxjW&26|gfAIcb1Zf;EvJ5twhz1TMmaPDyjCUPi)>vF&ZgPsOz%rQJ)je$e z8-HN8cO9+Wy!6&YRD{F>MIQYV0-z&th1ghX(OQJjn~AtW+z-G3fF&%PSVWz~(0xBGa{IP`5T^$gEA88ngJsf$f;06%kC81C$l@{m1`4ef$ z7m95Vj^Vvbwf*sXxfF(y&kk!5_U{9IWk!~(GmVeFWosQr?=(L8i~gUG=N!BaR}@A! z+|q2RpumP3pFhP?W?W$g#zL0C5jSE0F6~?AQ6y$Ou5b*-3M_*oH%skXDRG5kFcz{5 zj%D@0oZ0z+(Zj+Tp~?-p1Fqfe_;1c{+`-~WcAwjI5_`~IKwcXCOX z*%w+J#X|YuvAxf}R6cr=E6oB>pjmEoRB4Xu-uh86pW#blaVHL4p}-ZZ@@%Cr+I4~? zwQv5A@QvzTYm2Y$^Bs@yk%V!0q$`SXJ1HT}m!yTo_Q&D6XkCBX7vu<36Pn2JGkF?i z%t_`_D=${_rDz3PKT$$uW^7zx3dW+-6eW~gPK_%}nSX$3QEBHKnW6-y!=(g;+=(qdu!KX@3)FmSnkK}<(Ck#!i^ zs(7JNO6)a6KeKn9z!@CVqiLyqTj~JJ0mdq@Ohb>^3Im=f9IMbo-9p6{$92zyl7$(v z2_8yanZ*Y^EIaQrmSGP}`z1EMTwS`TgZFDxQ#>ooS9|MQuIpv00Y>4RH+ac-9Ay~4 zg>wQAmu=a!ESfqhagudRq$b=4a6>T^%GyGur8ve?9ktSn+l{H?M^dC*mS7L{-yM%~ zgb&N!VZ4mIfAo4U0n-T*2aMHh8@8QRi`q+LdO}gbTpA|xMo$qhRY=YpIxJnN#=`rL zQM?frR$%!h2C<(QTbhT>$Lci3%p64l;RU(5e2Hr{G~04B^ogm%nw%?H1y`rp4fxX1K#`9< zR=|JCaf9(FdF)s_R-bdcFP9=nR9Mg(tG3?#>pFZ(VMbSEBJ_6^495XS`#Ty)3oIvcVqOLT6aW?;Q1=%S$*=^S z42iVW?$ES1U3eu*$wDy+r9g~MD7#BU-=6^308!iQY5t)0%R(W3&>#^!h5K1>94}WC zXg#oJyI!L^m64T%CFsvEn!u}E_=12Z9@j(&0y`ZC6L9da_cVRBGBJiRm7nOxvMq0M zE=q@In1MnOsbERcui z2UX|5DW>$?&rot9R87O=1`z}{N6#xASf+z$YIuY|!D|EAJb@KJw(!sCy5nsDewr)x z)@wK?&3^iMnxZ9|9AGTchmQ$cp#+cc6UebRuJs++G}F`ym1JDuSUna+#%d9UFYCGZ z{^Py7cQA?}tA~=Ny);u8s}v}XO(>=GW=mI%VO*i8q#My9KOtEzWu5jqu7^kC3b}G& z0R9M?B3Q=i_M%lmSf%J&NaKzOjfUA(Gvf-Ah7~0L35B9mDRZ!&z=`Mk(4hIFc2S@qOFYg|?C^0IFympKZ4CVvc|~Rzlv|jk3Bz=P z38dBPdb2q(t}vmz4^6re&}ns=u4Vagg+S-r2pzv|BA&W5i_+Q0Z)&w&tzHk~3J=HP z3KLKlizquo%T#1wt#$*@Mi5sh`Ei8=!&5`u07mf=@+CKiZm(>4j*65TTU=7$@agDQ zx1;FWcL<6tKl3$8DbfO!pJfV*iihJi@|cWCHL%pBqF9h6k)vsvL@SoSJycs$bu`>+ ztfBC?qc2gS;v*`G<|&S61V!LQwEsm-E?ha!u*vPW+it5Z&!|1ZX}a*_Pmw;u$nk|2 z*g}P5L>D$X%ZQdhAbBYW_robdo-5)$fHTyNqoRzm7)2{5V13CXGC=YJP)hThV|vm4 z;b$u_+cDVFSkly;Ks;8rx3ukbKOS&gTw!#sz#4>RiN9N|T}SJt#udiZSERJ~L|}NO zD-tZv1RbNR#Z810^jI)4Tu;TwWItQYoxW+WU$T=C28t_Wv}Gm7(miLmzR-J(OxFmV zX>k%?oDs`2oWN0N0+GI}3ubp~0~29T-w;P`6eLVCq%-AN078k%(59Ajg$hiBp_6-U z`PIZQ6_<~usvNU=b1LWbDM$ewIiS7mSb3yNW*d6%lB5N!Q%ig%2FQC0369I5h!H5PvGPZ=k(sblY6KE@x1GeR!viF zRH55(oT(7oluqs?SxStY?KmxU;7^ldNNS-}rEwHqgAj(__S)u#-tTAFsu;3AhqB)l zAb9~MdgQ%eFKB4p$)&jy+Gc`$LM|Q=L&4?Zwzl0d*Kgl7^>HO5X^vTX;*bG7=y+(i zo#7}9Il1qni35E+`?2A?xn0-e_0Ow(GJTohx=}qA$hLcBg+%!`(5yqMzSm{pF- z{|87N($c7t`~7HO8qA6Of#rmz4v)kXC(KkSQ((<7gKaSIRcst~0D2lsjKOep(EhzI(Kbv&o{_y>PAHR*8p(&2}yaT$D z_Z|g0fUZb72#j?bTkDQ$McXq9$14frg4b)c^rjlnVHIKTk;6zdg`RP}Cj8vZJ^b+f z&ZCuBpLp2@gis5@$;io_82kke_4d7MamOY%l}=QTBWsk^F~OA zl}M=qm^w_gWvc4RN0%d`7(Sg6sN$YIiF2pEvSM}3TvnAgH)R?z1##c0C-8_u!gZYc z7q1wNPU^}U9_pH=*EXzPGn_vxFCRV&r?E6&A{ojT=AFjJ_nq!Q!HGn3wpe1zak0wr zKmxSXc0ivkmG(b>hD1vXZ9uJ_0q=G1Ti@wz+|4w1r1`u@o!rCVZO3li_%PxOo>X3f zG)vGtT(neTq)OjvRxF>L4LtO{{ysM1wrseNr_K0)3$4E1@ zSc+3}wfdt${A1wc4gw((|IkIkPQCS`H;v}zW1Tynz*#=^)2Xc|?!=tjwfx=$1mg1L ziB{FPBG$EfU0A>{w@?)nwcFd?NDm>z#?x_t4uN!O@XkP|H%bRpBPuFM*BOEU5#O~P z3IL`g(h|tTm?ZHWOG^p^!?V?CJ2_AC)c|ndwR)NrKXhR(1Ek;>Mr2u;=ktP4l7Ilu zkhnsVv@gqAuG_RM`|;}-+Ni{@!{Era3_n&KcU9M291|Eu;y8sD;Bhdnqkodk6F1jfgi^v5Kcqrzpr+5-J9>eqYP(;xmFUQN>0-m7rBf0ybf20u`F|zsNIP^C|5Il(#awba&8h)m?T00+qZ1%ci4RtAcEPyXouQObyy-sg)%|W8`uq|v@j3Os248cYQ>ys1& zCNEPW=jCis7I*>SaKOPUKe?he>api$I08rS!}bb?E--_PlE6>5-CK{OA;5C+Dd^>L z>Hb)bWvDwl1P_8Q3%#n=>pNEfeYWC4y_arMiS>_db(+FViIoMQV`y5twjDuNVLMvn zK$cC|>}VG0v0xKnL=L1~*R%2xDs#`!glQO$Zry6#y&KO#>Wwc=*ypDXofGtr)ou13 z-5GHk_iZbwRQhxrLsz#pNkJwU2KH*LzPtUC_eMep)9EDmG21>rG?ViUf4zq{N8Q*d zsYoVs4q=oa!zqDOkwTtic-Pd$xuT%(hv!8z=RK(RcCM>_-;%{ePAr1VHPoIF6lH3v z+0zo{Z`X89wF`aj8#G|NdhN9hOEtr^Fym}$u|GPx*=aT@Uy}jj-fg$nuH7`6ovf7= z(FjlgUg3>UDsap2Y|Coy^7BGDGJ=*908tkTRUINU^PVwdSR*3FspPf-5j5+gKscx!-}Nw0kWAvxM?UY41uZE~Az2CcaB->1l@*F-9K&c`zol;8 zdE9fy@1Jdy)PrWBf2`I{_ui$)MOV{mu%g4%*IO@-7piDM#Kolsahs4UEmK1;3d?!58m@TKyZFY?79Koky^a}?3&bOer>oh?1Q zwMueAUc|e)17L2ceS}i)FFbu*qSI5sc1$BEfHS7eX07@0Z~ZEKIrba> ze72PT1av@3uxw|2d+WwO`d?hj+VcQl1w^+w9cVZ~f*!hA)Tz z@o!d2^N9yFI$h`i$JTdWM}<(TKm9663w6`&ny%%a3V<^N5-&1%XLtS1Z~q3|Ir!_p zRSFZ+CnYFV?{59&n*kl3O)u44+g!W*+rJK94*dFWmu444%bTx;E}3^P-f!)q09|c+ zbNAiv0OisPKf_mIgAV7}zLST5=k<;D)!+IRj3S@;-~L@uLfh6ko?hrzIXJJO+*Tj0 zZ>+tJO2^E;_FPdEi%iOpt#uk#{`tRv&GyM({f7(E(9hBFf%To89mj!_sagN?usR`G zP+C3Y%5Rx||F9S*;|h;=FWp}KKmS*_wfJ}bVd2c7(Fe`4ylv6z-}nPKu6j1j&g@B5 zX0&d6u<;gh^__e9=Rgci)lwNdD`9oQQ?D|WrBrFVb@Tkj+aVqK@YAW%uCe{7c?G%2 z=bwC8+;>!*n;Dh*8y7D={3fatx#!FOUHsQ#&e(gl62^7YLYEP=NfX8&!6}dQ(Evw^bgRobNj;Pd&uQ{ z_W3VJht8y`?2O&D)^#-Q%JCO`Iw^Xr&fSY!AAAeV)n`91?LUoEl(f7zVh~4kwDo%9 zJlb0dPk)h{Es8Vwpb$`WE!M6*y!U(m6bY}t^lPQ#%Lz$-Y_ z)t;prfT29Ue=wE-h)C#nrxIx$`ty0WcHz57mw)PWbhVVK$7N~rQOQ>vD;nYvFm2#>ct9|p*qqop|RiF7HDHn3CE6g6o;!stuJ!)R_ ztA8GUnJq1eOLI7v+=7~yuC09QU!nK<{QsCgbvz+hZ~x>2qq%K1b_Uf6aj^)C%P<`$ z$WMl20OdKBFt+aOUPqxk<>Su@^9Mt*0!}%a1I&ce9Ki@yd#7{bT@btTCx41Vu2Jr& zUQFA4*u3&Re^2;q;Oaiy5yM9^E0zK7mSKEo7>yz%vGgEEKv#C74p#uPV%XF$0b=qD z1L(?W?bxlI8-MWKJ8i3`JBEwwLU8GhS2G;AdGS|&&1yI8b~AuksS*^RE4Q@+R{*n8 zKY*_6b_=cmW~F`rUAcb6z}mat8Hh3ft;D=kU7ia@4bYX{uGy{KOaJn>L>#M-$?_mL zhMDa)NP@VfZNB*do*~%+y0U6(R&CRVSrH)>`p2?3ACm#P3Ze)f{QiGfxo1{b1}5r7Zq%F$K0npfT?Qfkqo83pLd)&MbeSN`nZBzL#nddSb!AX-XW zJ^$wBhSu&_mhA@p1Dj;KZEbGq_uu+6M~8`}Bbb$7rvDYtm20SQA($0YR^x+~fUay) zhimh_Z)K_M09`o-oI+Xvvru)HfI?)6Y<=);U!UAaaVuG*#Vrn|Y|IY3wb9P6#V`SsC0 z4jKWv3g%$|vr_d~t8abX^V@8F_~**rWBEfTQG{UpYz1@`jC(VPBBZHN?`S|*01@C? z`S!m`ype0#7=~75cO{G>+`fHzw{G<`+jheJ2fn~RcN@mq)%SCbjk#{?_62G2$^3z* zOUGU*AA6;6;2CN0gfO$8QL3F=@1tl|z1O__`fyp{i9O+au#n*jU{-8L?AJdVsZN;k zX)wNl2?rs^ zgnbg}kj7Le910A7O>L(6kTE!eO~P1Nw!#6l8q;Pp2^uz`&9I3VD|tn7>CWJ=Xh~Ke zX_hL@&&(7lhNLJ802Wf!a-`=o*52G^W|4A&VrT^?YNkEja5asVaT*KQUn3nH$64R^ zJcf|Yy=tu8gL#JWLXqb&0yjafnc9@;o3O|MAG-*yLhUgkT4}&xLnh9 zb^ptl@q#vn;{eiCvCwqYXaL}~DKC8~fJ~V)J%PnWBA6zLE*XJ3{ZOuCbl`+F8!?51 zfqgL>*~r8C_em~waQLvjfI*aChqS3+wMdQ*4NoP#A9T1lo*|3y2`moE&)Mk(^R}>Ur0;K=|}4 zC}^!mw~-^fspkGa_UZdzDSH#^gv*z)Nmf-o1bJNI ziv+P|Sfj7W%oKYyjS!@Tr^6b8qaUVPOw<`1{cume*f{?qQV@^*`o9o)_CF~dcCM@$ zp7O;0GcUh7&+~bjwp_=EgB$LdbBzx^zy<#BZ~Ugv&pyYJgoSj>;nZiA=hrVk(rrfi z+~)`}JuL+_bFO>!9gO9V|C8V5MLBi6fR4Jdg>z!{XI`VIbUN(Wv#k%_BY5G!Kl)9e zBVzcR%ohk^h9VuD5-O#cJ#&@kUUWL7FuQmESHCO)rXy2IZ*pfpv-|#=Bwu*?cm8FS zfo%qpa9lzAHJlQ;bsHUjyd<<$OOmSRmdYiPU{In_LZ-+9O;s2QepR5T$}6wztkvn# z{Mmo-Kgl#RK-Vol3=GFG=u&KM&-SI;hD-6!e~pmS$AXX#YIi?^&2ImH|7+Y_%3Kvm zN;q=5cjpeyaKy}kSQKI8M zUj8|pmD3)DD#z(N4={>aeCbO}c|PUMG2l6G)HX1Z&Oh;~LBi6wrVBP=L0i8MXLj!OWg)ef%Nx&;GytYy8Zh%4*JWobFBw+20KVC)vj4n&}eko^v=W zCJ*g?2$f!Ygb~!jv!7)Ov#A&ey;pM!+9*e!CSp;9Lq95t6SS=rko9NIeugPjQ|a`p z6AtSYj?y7nUfX^I{Zl#f8dI1_O_3E;Cj@b5_N8B_Jb8vM7o_>JvOHTnv{XK_oL`<3 z=1TJ77djumNwdn)zx%)Qi(x2Yk)!e~35Y!06H5CZ-n_3ljPm@?5dxVCZs_6@-P`ZN zEIRx5f2VYKStu3d*_r&(yfQy4l}lVfW<-ITJE(0uB5<;B`m>}TWjvY$lM!Y*t2bb7 zEWYxKOr@IoEJ~a;YAYDU6i$8?AadF|#Tc>BS-lPYv-rx-i~IJ|ya2F=RRok;v!@4u z1+CNiI?0N2ul!fizPbKf#_%xLslUGDzWt+$G!P@g`V(J7w zSQ9bUSj0M|mSPJ13aT_MaCzB}dL8$Jd_gY8qcfn(ciJjW;?lenaCJ)JDt!g*)vms2 z+K-(!^gk~s#xSLyLCSL7mW^yMJb{bD#0TDnsTT=sviJK+-Y0hbmMkV zqG$s7hVwKR7)@;3R!z-GbrT!=k!bn}C4Y<$1>XxbeMh$+OVNkpm{MdE9FuW;KTVW< zJ0Xzxp=Rl>$K#lYf+eS&mVl`4_Ozbk8m?3CS5?wYv({Bt9$KC|S!{zx?b%CFI7(*7 zv;A6xHf*`Q3I&oSIusqtzWGN#dOU4rR#BWWWqaarg{anNP>awDYY}>m&E#dKAWsY$ z&5d|!7#+2@zBQn4S?I=AQ{}5AK`GE2i(Hg+z1OTex=pYoCy6x6VA<(_+>CNJy+%`Sp*}HN zt@ir**0%0tmd6=t8sI>k0qjrVs1{*$v0sa@rENZngnVXEnjBX+`j_;v9=Y$=B3!0~ zur{K)`Oq;mlozouQ#yL6e0Xp6you3*k*^38jpKC#x;Y#G&B)zYaT9}+HKmX4!8tf* z87$Azte@;qx80^{+Pc?2_O$iO*TVD}-l)bnF^{~lriJl=d*L@>rpOlyVqRi=j{>#V zTfKD8Y&Hm%=Sngmuy~5j*-N)^cms3Qw(XzaR=3{WS=((G{eZv#npD}DW2x*d%nCG( z0~VK$7yKeCo~aw{s|{Oij@@b837wx%_PdXj!ZCfOQM|$w6fBiy(jG#e<)wOAg)Q_Io#8XGQ|fZ4)V;7d)I8UIW z_bn|Jp;x=A&wbxo{cSEw}b*%KkM}$L`ZLKVF#S;Vp;wA_X z$6zosz#KhiPfy>~-E|*%-+u39R#s+J*3lp(v6v*Qb6)-Pk{8VJnSyGTNEU1LABv0Qf*;2@;`lR`#h043XMbU7JZ8!)C? ziZhd;Gs!I0ae1XF1|Tic(mwi2#^p2(-5Zgfl%$ztC`|*M$p|wAQ)xyh-bSPp>{=0^ zJ+#&c|4fpsJ|Xe7b6pG+E=;HVG!5P%HI+>ZNtC8R?~xEzti;#~M?5aZ1lhF}h9oiR zWNvy60Zn+6XL+6z1YH(!io^n&+<^A!w-thiSeB`^)ebaaWX0;f#GnkG9b2KS*!d|w zefU075U7AH zYnCc`f8Z3WXjUQ`hiXYB&2`x6ll_$!6=S+EQ#d^xa0s#-M?c6^Kg2AlF?gLJG9}YgT5=hntF2$h{W>v9OYo0{v0%E@bdt@ayj*Q=uRp~Q zj3t7#DL)AvtxU_-ybTgdXf2%*0G`K1%h}P*d6c9C?8nD><~mg5!XfexkFmyyMht(_ zBpKxX<8TaIU|H8OVn>nJH&?*OWz%_#7KRI9p^c0{3KiRk=BlV~)#}eb2hCVdJWVf- zU<{BM33ri+P}}>sM9nK8_8`6BV`iJaj9bfBNgG zPG-v?03a92{)QtbTLv_di|rWZ)dmc{J)9MCL(?}~j=QR;9=cL(+i6k%YF z9E`D2Q`4Oh1j)^K4klj1l^pq2Of7_XY$11AsB0drP2)9SwkX<>hh*i`8kZz&3yJ7bb%j^ zv08E>!_s}`S}e=c%hz{q{>}er+h*?clkD{5N5)uMrP93oDwV9$rc z{(34z@ZmbxVVcu%9H__77uDax6wFD5hxS5uTq8=N)s(7bh|nFU8`KRdqgH(}${ zgGMja~Suel%;`pu6vYjPW3y&Iru8ejCTpr8{ zFKhAG5sNtL_>6T}qNu2ZDeG!`tvM{miRt*3!H&@fOsJPI70lKm^*@n?TzlgdYVX@LYEzy)#Fh&h8kvhl$H)Ttk7{gVpzm&An9!9)H66p>0X6hK#w+yWPZSy&=5FgY9^ zz3CWsP#(i^Y4w7~v8Ziazy?wfdOS*?eOxM;>3@B26QC;?1!kxSW(|^r$JQ{M9}7hh zdYpzAhNYG6Y|`EQ>=;a1OE4a1CEvRAdMBd%_4anTa$_}i@dvYWTA%}T<(+531pvCT zumA>#t!P5Z{*{!fP7v^A-L;89-_V%WgVF!C<|T>&BBYF>GDU~NL9 zj_ss_#~~qGCqExWwlAM&1=cdf+S%s^{T71fz75m~r7s5vOWD5RS_ZiE-5X&EmRwc$ zuA*Z_Xni&vWEt$OF3qydrJs5I<-sg$5H=WB<WlwR(ZEs!q zwMAE>+V39~W7&o&?N!^wk|C>Z$ZcX|rTm4XB~?mwnj)!yFB2er-O`#G0v7HKxyws% zkHAcHyt15sw7%G%+mhuZM9XPfj_$c_xNhz0heo}Y7;NGL_#g>Qcp-ual<#x7cK6q!ZG^F$zEq`79C_RD4}eFO>jtJu2E)?e<=qkJN(mXuIFiJ%fe*w+)uumP z#sFn-;+Mc!Sa_mE5ezm&nr&E8Rg!CxWmw_zuIrB9#7r(5BpL5}33m|a3D8N5w{&b| zaco16hp|FWb^9fRisJn@b-g_lWutafvT4CKT*)p zhjtRFBrK`B?&h6cisNt`XO0|^Heh1dg|9!&P}GpYf|%0DEEpyjw44U2teWjA4s=#i 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%0A>M(T>ES1Sm@r-YL=NUTT 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

GJ+n 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 fgH6hR_Xb9W(gTe~DWM4fNDQ2* From 7016425ae79cb99cc26041259e0051f9db46ae72 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 21 Jul 2014 19:02:54 +0200 Subject: [PATCH 50/69] Cleanup (two utility classes merged) --- .../stubs/JavaImportStatementElementType.java | 6 +- .../psi/impl/source/JavaLightStubBuilder.java | 4 +- .../PsiJavaCodeReferenceElementImpl.java | 2 +- .../psi/impl/source/tree/JavaSourceUtil.java | 81 +++++++++++++++++++ .../psi/impl/source/tree/SourceUtil.java | 79 ++---------------- .../tree/java/ExpressionPsiElement.java | 21 +++-- .../tree/java/PsiPackageStatementImpl.java | 4 +- .../tree/java/PsiReferenceExpressionImpl.java | 2 +- 8 files changed, 107 insertions(+), 92 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaImportStatementElementType.java b/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaImportStatementElementType.java index 7c9af30f1d9b..93e359e6778a 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaImportStatementElementType.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaImportStatementElementType.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -24,7 +24,7 @@ import com.intellij.psi.impl.java.stubs.impl.PsiImportStatementStubImpl; import com.intellij.psi.impl.source.PsiImportStatementImpl; import com.intellij.psi.impl.source.PsiImportStaticStatementImpl; import com.intellij.psi.impl.source.tree.JavaElementType; -import com.intellij.psi.impl.source.tree.SourceUtil; +import com.intellij.psi.impl.source.tree.JavaSourceUtil; import com.intellij.psi.impl.source.tree.java.ImportStaticStatementElement; import com.intellij.psi.stubs.IndexSink; import com.intellij.psi.stubs.StubElement; @@ -68,7 +68,7 @@ public abstract class JavaImportStatementElementType extends JavaStubElementType for (LighterASTNode child : tree.getChildren(node)) { IElementType type = child.getTokenType(); if (type == JavaElementType.JAVA_CODE_REFERENCE || type == JavaElementType.IMPORT_STATIC_REFERENCE) { - refText = SourceUtil.getReferenceText(tree, child); + refText = JavaSourceUtil.getReferenceText(tree, child); } else if (type == JavaTokenType.ASTERISK) { isOnDemand = true; diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaLightStubBuilder.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaLightStubBuilder.java index ff8c80db3729..3413fda3a3fe 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaLightStubBuilder.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaLightStubBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -44,7 +44,7 @@ public class JavaLightStubBuilder extends LightStubBuilder { if (pkg != null) { LighterASTNode ref = LightTreeUtil.firstChildOfType(tree, pkg, JavaElementType.JAVA_CODE_REFERENCE); if (ref != null) { - refText = SourceUtil.getReferenceText(tree, ref); + refText = JavaSourceUtil.getReferenceText(tree, ref); } } return new PsiJavaFileStubImpl((PsiJavaFile)file, StringRef.fromString(refText), false); diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java index 20ee0c571400..807b42d60383 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java @@ -751,7 +751,7 @@ public class PsiJavaCodeReferenceElementImpl extends CompositePsiElement impleme private String getNormalizedText() { String whiteSpaceAndComments = myCachedNormalizedText; if (whiteSpaceAndComments == null) { - myCachedNormalizedText = whiteSpaceAndComments = SourceUtil.getReferenceText(this); + myCachedNormalizedText = whiteSpaceAndComments = JavaSourceUtil.getReferenceText(this); } return whiteSpaceAndComments; } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaSourceUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaSourceUtil.java index 8cf5b5bfbdd2..e2af7b08df0d 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaSourceUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaSourceUtil.java @@ -15,13 +15,28 @@ */ package com.intellij.psi.impl.source.tree; +import com.intellij.lang.ASTFactory; import com.intellij.lang.ASTNode; +import com.intellij.lang.LighterAST; +import com.intellij.lang.LighterASTNode; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.*; +import com.intellij.psi.codeStyle.CodeStyleManager; +import com.intellij.psi.impl.source.DummyHolder; import com.intellij.psi.impl.source.SourceJavaCodeReference; +import com.intellij.psi.impl.source.SourceTreeToPsiMap; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; import com.intellij.util.CharTable; +import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; public class JavaSourceUtil { + private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.JavaSourceUtil"); + + private static final TokenSet REF_FILTER = TokenSet.orSet( + ElementType.JAVA_COMMENT_OR_WHITESPACE_BIT_SET, TokenSet.create(JavaElementType.ANNOTATION)); + private JavaSourceUtil() { } public static void fullyQualifyReference(@NotNull CompositeElement reference, @NotNull PsiClass targetClass) { @@ -61,4 +76,70 @@ public class JavaSourceUtil { } } } + + @NotNull + public static String getReferenceText(@NotNull PsiJavaCodeReferenceElement ref) { + final StringBuilder buffer = new StringBuilder(); + + ((TreeElement)ref.getNode()).acceptTree(new RecursiveTreeElementWalkingVisitor() { + @Override + public void visitLeaf(LeafElement leaf) { + if (!REF_FILTER.contains(leaf.getElementType())) { + String leafText = leaf.getText(); + if (buffer.length() > 0 && !leafText.isEmpty() && Character.isJavaIdentifierPart(leafText.charAt(0))) { + char lastInBuffer = buffer.charAt(buffer.length() - 1); + if (lastInBuffer == '?' || Character.isJavaIdentifierPart(lastInBuffer)) { + buffer.append(" "); + } + } + + buffer.append(leafText); + } + } + + @Override + public void visitComposite(CompositeElement composite) { + if (!REF_FILTER.contains(composite.getElementType())) { + super.visitComposite(composite); + } + } + }); + + return buffer.toString(); + } + + @NotNull + public static String getReferenceText(@NotNull LighterAST tree, @NotNull LighterASTNode node) { + return LightTreeUtil.toFilteredString(tree, node, REF_FILTER); + } + + public static TreeElement addParenthToReplacedChild(@NotNull IElementType parenthType, + @NotNull TreeElement newChild, + @NotNull PsiManager manager) { + CompositeElement parenthExpr = ASTFactory.composite(parenthType); + + TreeElement dummyExpr = (TreeElement)newChild.clone(); + final CharTable charTableByTree = SharedImplUtil.findCharTableByTree(newChild); + new DummyHolder(manager, parenthExpr, null, charTableByTree); + parenthExpr.putUserData(CharTable.CHAR_TABLE_KEY, charTableByTree); + parenthExpr.rawAddChildren(ASTFactory.leaf(JavaTokenType.LPARENTH, "(")); + parenthExpr.rawAddChildren(dummyExpr); + parenthExpr.rawAddChildren(ASTFactory.leaf(JavaTokenType.RPARENTH, ")")); + + try { + CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(manager.getProject()); + PsiElement formatted = codeStyleManager.reformat(SourceTreeToPsiMap.treeToPsiNotNull(parenthExpr)); + parenthExpr = (CompositeElement)SourceTreeToPsiMap.psiToTreeNotNull(formatted); + } + catch (IncorrectOperationException e) { + LOG.error(e); // should not happen + } + + newChild.putUserData(CharTable.CHAR_TABLE_KEY, SharedImplUtil.findCharTableByTree(newChild)); + dummyExpr.getTreeParent().replaceChild(dummyExpr, newChild); + + // TODO remove explicit caches drop since this should be ok if we will use ChangeUtil for the modification + TreeUtil.clearCaches(TreeUtil.getFileElement(parenthExpr)); + return parenthExpr; + } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/SourceUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/SourceUtil.java index 93e9f60c890e..554580828c0b 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/SourceUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/SourceUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -15,94 +15,29 @@ */ package com.intellij.psi.impl.source.tree; -import com.intellij.lang.ASTFactory; import com.intellij.lang.LighterAST; import com.intellij.lang.LighterASTNode; -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.psi.JavaTokenType; -import com.intellij.psi.PsiElement; import com.intellij.psi.PsiJavaCodeReferenceElement; import com.intellij.psi.PsiManager; -import com.intellij.psi.codeStyle.CodeStyleManager; -import com.intellij.psi.impl.source.DummyHolder; -import com.intellij.psi.impl.source.SourceTreeToPsiMap; import com.intellij.psi.tree.IElementType; -import com.intellij.psi.tree.TokenSet; -import com.intellij.util.CharTable; -import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; +/** @deprecated use {@link JavaSourceUtil} (to be removed in IDEA 15) */ +@SuppressWarnings("UnusedDeclaration") public class SourceUtil { - private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.SourceUtil"); - - private static final TokenSet REF_FILTER = TokenSet.orSet( - ElementType.JAVA_COMMENT_OR_WHITESPACE_BIT_SET, TokenSet.create(JavaElementType.ANNOTATION)); - private SourceUtil() { } @NotNull public static String getReferenceText(@NotNull PsiJavaCodeReferenceElement ref) { - final StringBuilder buffer = new StringBuilder(); - - ((TreeElement)ref.getNode()).acceptTree(new RecursiveTreeElementWalkingVisitor() { - @Override - public void visitLeaf(LeafElement leaf) { - if (!REF_FILTER.contains(leaf.getElementType())) { - String leafText = leaf.getText(); - if (buffer.length() > 0 && !leafText.isEmpty() && Character.isJavaIdentifierPart(leafText.charAt(0))) { - char lastInBuffer = buffer.charAt(buffer.length() - 1); - if (lastInBuffer == '?' || Character.isJavaIdentifierPart(lastInBuffer)) { - buffer.append(" "); - } - } - - buffer.append(leafText); - } - } - - @Override - public void visitComposite(CompositeElement composite) { - if (!REF_FILTER.contains(composite.getElementType())) { - super.visitComposite(composite); - } - } - }); - - return buffer.toString(); + return JavaSourceUtil.getReferenceText(ref); } @NotNull public static String getReferenceText(@NotNull LighterAST tree, @NotNull LighterASTNode node) { - return LightTreeUtil.toFilteredString(tree, node, REF_FILTER); + return JavaSourceUtil.getReferenceText(tree, node); } - public static TreeElement addParenthToReplacedChild(@NotNull IElementType parenthType, - @NotNull TreeElement newChild, - @NotNull PsiManager manager) { - CompositeElement parenthExpr = ASTFactory.composite(parenthType); - - TreeElement dummyExpr = (TreeElement)newChild.clone(); - final CharTable charTableByTree = SharedImplUtil.findCharTableByTree(newChild); - new DummyHolder(manager, parenthExpr, null, charTableByTree); - parenthExpr.putUserData(CharTable.CHAR_TABLE_KEY, charTableByTree); - parenthExpr.rawAddChildren(ASTFactory.leaf(JavaTokenType.LPARENTH, "(")); - parenthExpr.rawAddChildren(dummyExpr); - parenthExpr.rawAddChildren(ASTFactory.leaf(JavaTokenType.RPARENTH, ")")); - - try { - CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(manager.getProject()); - PsiElement formatted = codeStyleManager.reformat(SourceTreeToPsiMap.treeToPsiNotNull(parenthExpr)); - parenthExpr = (CompositeElement)SourceTreeToPsiMap.psiToTreeNotNull(formatted); - } - catch (IncorrectOperationException e) { - LOG.error(e); // should not happen - } - - newChild.putUserData(CharTable.CHAR_TABLE_KEY, SharedImplUtil.findCharTableByTree(newChild)); - dummyExpr.getTreeParent().replaceChild(dummyExpr, newChild); - - // TODO remove explicit caches drop since this should be ok if we will use ChangeUtil for the modification - TreeUtil.clearCaches(TreeUtil.getFileElement(parenthExpr)); - return parenthExpr; + public static TreeElement addParenthToReplacedChild(@NotNull IElementType parenthType, @NotNull TreeElement newChild, @NotNull PsiManager manager) { + return JavaSourceUtil.addParenthToReplacedChild(parenthType, newChild, manager); } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ExpressionPsiElement.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ExpressionPsiElement.java index 1d8693efc55c..e0b122e95592 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ExpressionPsiElement.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ExpressionPsiElement.java @@ -13,10 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -/* - * @author max - */ package com.intellij.psi.impl.source.tree.java; import com.intellij.lang.ASTNode; @@ -24,13 +20,11 @@ import com.intellij.psi.impl.source.tree.*; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; +/** + * @author max + */ public class ExpressionPsiElement extends CompositePsiElement { - private final int myHC = CompositePsiElement.ourHC++; - - @Override - public final int hashCode() { - return myHC; - } + @SuppressWarnings("AssignmentToStaticFieldFromInstanceMethod") private final int myHC = CompositePsiElement.ourHC++; public ExpressionPsiElement(final IElementType type) { super(type); @@ -42,9 +36,14 @@ public class ExpressionPsiElement extends CompositePsiElement { ElementType.EXPRESSION_BIT_SET.contains(newElement.getElementType())) { boolean needParenth = ReplaceExpressionUtil.isNeedParenthesis(child, newElement); if (needParenth) { - newElement = SourceUtil.addParenthToReplacedChild(JavaElementType.PARENTH_EXPRESSION, newElement, getManager()); + newElement = JavaSourceUtil.addParenthToReplacedChild(JavaElementType.PARENTH_EXPRESSION, newElement, getManager()); } } super.replaceChildInternal(child, newElement); } + + @Override + public final int hashCode() { + return myHC; + } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiPackageStatementImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiPackageStatementImpl.java index 5a42715590ef..29d072970560 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiPackageStatementImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiPackageStatementImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -38,7 +38,7 @@ public class PsiPackageStatementImpl extends CompositePsiElement implements PsiP @Override public String getPackageName() { PsiJavaCodeReferenceElement ref = getPackageReference(); - return ref == null ? null : SourceUtil.getReferenceText(ref); + return ref == null ? null : JavaSourceUtil.getReferenceText(ref); } @Override diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java index 02ffaa6f3c20..8dd43933c660 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java @@ -761,7 +761,7 @@ public class PsiReferenceExpressionImpl extends PsiReferenceExpressionBase imple private String getCachedNormalizedText() { String whiteSpaceAndComments = myCachedNormalizedText; if (whiteSpaceAndComments == null) { - myCachedNormalizedText = whiteSpaceAndComments = SourceUtil.getReferenceText(this); + myCachedNormalizedText = whiteSpaceAndComments = JavaSourceUtil.getReferenceText(this); } return whiteSpaceAndComments; } From 72a3ffa88fdc6a3403f6cba9d84941eafbddc794 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 21 Jul 2014 19:03:09 +0200 Subject: [PATCH 51/69] Cleanup (formatting) --- .../src/com/intellij/psi/impl/source/tree/JavaElementType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaElementType.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaElementType.java index 4fbbad26964d..8d42dbeb4f90 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaElementType.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaElementType.java @@ -84,8 +84,8 @@ public interface JavaElementType { IElementType PARAMETER_LIST = JavaStubElementTypes.PARAMETER_LIST; IElementType EXTENDS_BOUND_LIST = JavaStubElementTypes.EXTENDS_BOUND_LIST; IElementType THROWS_LIST = JavaStubElementTypes.THROWS_LIST; - IElementType LITERAL_EXPRESSION = new JavaCompositeElementType("LITERAL_EXPRESSION", PsiLiteralExpressionImpl.class); + IElementType LITERAL_EXPRESSION = new JavaCompositeElementType("LITERAL_EXPRESSION", PsiLiteralExpressionImpl.class); IElementType IMPORT_STATIC_REFERENCE = new JavaCompositeElementType("IMPORT_STATIC_REFERENCE", PsiImportStaticReferenceElementImpl.class); IElementType TYPE = new JavaCompositeElementType("TYPE", PsiTypeElementImpl.class); IElementType DIAMOND_TYPE = new JavaCompositeElementType("DIAMOND_TYPE", PsiDiamondTypeElementImpl.class); From 124d7744d40fc5b62d5ae2e0b24d7032e00b646d Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 21 Jul 2014 19:07:43 +0200 Subject: [PATCH 52/69] =?UTF-8?q?generic=20debugger=20settings:=20step=202?= =?UTF-8?q?=20=E2=80=94=20stepping?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DebuggerSteppingConfigurable.java | 3 +- .../debugger/ui/JavaDebuggerSupport.java | 9 +- .../src/messages/XDebuggerBundle.properties | 1 + .../openapi/ui/VerticalFlowLayout.java | 4 + .../xdebugger/settings/XDebuggerSettings.java | 14 +- .../impl/settings/DataViewsConfigurable.java | 118 +----------- .../impl/settings/DebuggerConfigurable.java | 6 + .../DebuggerConfigurableProvider.java | 20 +- .../impl/settings/SteppingConfigurable.java | 54 ++++++ .../settings/SubCompositeConfigurable.java | 178 ++++++++++++++++++ .../src/messages/DebuggerBundle.properties | 1 - 11 files changed, 284 insertions(+), 124 deletions(-) create mode 100644 platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/SteppingConfigurable.java create mode 100644 platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/SubCompositeConfigurable.java diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSteppingConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSteppingConfigurable.java index 75d9a81edc62..a989065def91 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSteppingConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSteppingConfigurable.java @@ -18,6 +18,7 @@ package com.intellij.debugger.settings; import com.intellij.debugger.DebuggerBundle; import com.intellij.debugger.ui.JavaDebuggerSupport; import com.intellij.openapi.options.Configurable; +import com.intellij.openapi.options.OptionsBundle; import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.project.Project; import com.intellij.ui.classFilter.ClassFilterEditor; @@ -75,7 +76,7 @@ public class DebuggerSteppingConfigurable implements SearchableConfigurable, Con } public String getDisplayName() { - return DebuggerBundle.message("debugger.stepping.configurable.display.name"); + return OptionsBundle.message("options.java.display.name"); } @NotNull diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java b/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java index 32d024f07de1..0e5a9230fe72 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java @@ -350,7 +350,6 @@ public class JavaDebuggerSupport extends DebuggerSupport { @Override public Collection getConfigurables() { final ArrayList configurables = new ArrayList(); - configurables.add(new DebuggerSteppingConfigurable()); configurables.add(new UserRenderersConfigurable(null)); configurables.add(new DebuggerHotswapConfigurable()); return configurables; @@ -367,16 +366,16 @@ public class JavaDebuggerSupport extends DebuggerSupport { switch (category) { case DATA_VIEWS: return Collections.singletonList(new DebuggerDataViewsConfigurable(null)); + case STEPPING: + return Collections.singletonList(new DebuggerSteppingConfigurable()); } return Collections.emptyList(); } @Override public void applied(@NotNull XDebuggerSettings.Category category) { - switch (category) { - case DATA_VIEWS: - NodeRendererSettings.getInstance().fireRenderersChanged(); - break; + if (category == XDebuggerSettings.Category.DATA_VIEWS) { + NodeRendererSettings.getInstance().fireRenderersChanged(); } } } diff --git a/platform/platform-resources-en/src/messages/XDebuggerBundle.properties b/platform/platform-resources-en/src/messages/XDebuggerBundle.properties index 7c0ea2b59628..dd88b8304e0a 100644 --- a/platform/platform-resources-en/src/messages/XDebuggerBundle.properties +++ b/platform/platform-resources-en/src/messages/XDebuggerBundle.properties @@ -2,6 +2,7 @@ xdebugger.colors.page.name=Debugger debugger.configurable.display.name=Debugger debugger.dataViews.display.name=Data Views +debugger.stepping.display.name=Stepping xdebugger.default.content.title=Debug xdebugger.debugger.tab.title=Debugger diff --git a/platform/util/src/com/intellij/openapi/ui/VerticalFlowLayout.java b/platform/util/src/com/intellij/openapi/ui/VerticalFlowLayout.java index 884a11711992..43aa9b37b510 100644 --- a/platform/util/src/com/intellij/openapi/ui/VerticalFlowLayout.java +++ b/platform/util/src/com/intellij/openapi/ui/VerticalFlowLayout.java @@ -48,6 +48,10 @@ public class VerticalFlowLayout extends FlowLayout implements Serializable { this(alignment, 5, 5, fillHorizontally, fillVertically); } + public VerticalFlowLayout(int hGap, int vGap) { + this(TOP, hGap, vGap, true, false); + } + public VerticalFlowLayout(@VerticalFlowAlignment int alignment, int hGap, int vGap, boolean fillHorizontally, boolean fillVertically) { setAlignment(alignment); this.hGap = hGap; diff --git a/platform/xdebugger-api/src/com/intellij/xdebugger/settings/XDebuggerSettings.java b/platform/xdebugger-api/src/com/intellij/xdebugger/settings/XDebuggerSettings.java index 1c0afe84d41c..9546278edf87 100644 --- a/platform/xdebugger-api/src/com/intellij/xdebugger/settings/XDebuggerSettings.java +++ b/platform/xdebugger-api/src/com/intellij/xdebugger/settings/XDebuggerSettings.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -35,7 +35,17 @@ import org.jetbrains.annotations.Nullable; */ public abstract class XDebuggerSettings implements PersistentStateComponent { public enum Category { - DATA_VIEWS + DATA_VIEWS(true), STEPPING(true); + + private final boolean separatePage; + + Category(boolean separatePage) { + this.separatePage = separatePage; + } + + public boolean isSeparatePage() { + return separatePage; + } } public static final ExtensionPointName EXTENSION_POINT = ExtensionPointName.create("com.intellij.xdebugger.settings"); diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurable.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurable.java index e85f5a0e0778..d140a74f35c8 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurable.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DataViewsConfigurable.java @@ -16,138 +16,38 @@ package com.intellij.xdebugger.impl.settings; import com.intellij.openapi.options.Configurable; -import com.intellij.openapi.options.ConfigurationException; -import com.intellij.openapi.options.SearchableConfigurable; -import com.intellij.ui.IdeBorderFactory; import com.intellij.xdebugger.XDebuggerBundle; -import com.intellij.xdebugger.impl.DebuggerSupport; import com.intellij.xdebugger.settings.XDebuggerSettings; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import javax.swing.*; -import java.awt.*; -import java.util.List; - -class DataViewsConfigurable implements SearchableConfigurable.Parent { - private DataViewsConfigurableUi root; - private Configurable[] children; - - private JComponent component; - - @Override - public boolean hasOwnContent() { - return true; - } - - @Override - public boolean isVisible() { - return true; - } - - @Override - public Configurable[] getConfigurables() { - if (children == null) { - List configurables = DebuggerConfigurableProvider.getConfigurables(XDebuggerSettings.Category.DATA_VIEWS); - children = configurables.toArray(new Configurable[configurables.size()]); - } - return children.length == 1 ? DebuggerConfigurable.EMPTY_CONFIGURABLES : children; - } +class DataViewsConfigurable extends SubCompositeConfigurable implements Configurable.NoScroll { @NotNull @Override public String getId() { return "debugger.dataViews"; } - @Nullable - @Override - public Runnable enableSearch(String option) { - return null; - } - @Nls @Override public String getDisplayName() { return XDebuggerBundle.message("debugger.dataViews.display.name"); } - @Nullable @Override - public String getHelpTopic() { - getConfigurables(); - return children.length == 1 ? children[0].getHelpTopic() : null; + protected DataViewsConfigurableUi createRootUi() { + return new DataViewsConfigurableUi(); } - @Nullable + @NotNull @Override - public JComponent createComponent() { - if (component == null) { - if (root == null) { - root = new DataViewsConfigurableUi(); - } - - getConfigurables(); - if (children.length == 1) { - JPanel panel = new JPanel(new BorderLayout(0, IdeBorderFactory.TITLED_BORDER_BOTTOM_INSET)); - panel.add(root.getComponent(), BorderLayout.NORTH); - Configurable configurable = children[0]; - JComponent configurableComponent = configurable.createComponent(); - assert configurableComponent != null; - configurableComponent.setBorder(IdeBorderFactory.createTitledBorder(configurable.getDisplayName(), false)); - panel.add(configurableComponent, BorderLayout.CENTER); - component = panel; - } - else { - component = root.getComponent(); - } - } - return component; + protected XDebuggerSettings.Category getCategory() { + return XDebuggerSettings.Category.DATA_VIEWS; } + @NotNull @Override - public boolean isModified() { - if (root != null && root.isModified(XDebuggerSettingsManager.getInstanceImpl().getDataViewSettings())) { - return true; - } - else { - return children.length == 1 && children[0].isModified(); - } - } - - @Override - public void apply() throws ConfigurationException { - if (root != null) { - root.apply(XDebuggerSettingsManager.getInstanceImpl().getDataViewSettings()); - for (DebuggerSupport support : DebuggerSupport.getDebuggerSupports()) { - support.getSettingsPanelProvider().applied(XDebuggerSettings.Category.DATA_VIEWS); - } - } - - if (children.length == 1) { - children[0].apply(); - } - } - - @Override - public void reset() { - if (root != null) { - root.reset(XDebuggerSettingsManager.getInstanceImpl().getDataViewSettings()); - } - if (children.length == 1) { - children[0].reset(); - } - } - - @Override - public void disposeUIResources() { - root = null; - component = null; - - if (children.length == 1) { - children[0].disposeUIResources(); - } - children = null; + protected XDebuggerDataViewSettings getSettings() { + return XDebuggerSettingsManager.getInstanceImpl().getDataViewSettings(); } } \ No newline at end of file diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java index bff0d2236f7f..59d72fd24a3d 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java @@ -20,6 +20,7 @@ import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.xdebugger.XDebuggerBundle; import com.intellij.xdebugger.impl.DebuggerSupport; +import com.intellij.xdebugger.settings.XDebuggerSettings; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -70,6 +71,11 @@ public class DebuggerConfigurable implements SearchableConfigurable.Parent { List configurables = new ArrayList(); configurables.add(new DataViewsConfigurable()); + List steppingConfigurables = DebuggerConfigurableProvider.getConfigurables(XDebuggerSettings.Category.STEPPING, providers); + if (!steppingConfigurables.isEmpty()) { + configurables.add(new SteppingConfigurable(steppingConfigurables)); + } + Configurable rootConfigurable = null; for (DebuggerSettingsPanelProvider provider : providers) { configurables.addAll(provider.getConfigurables()); diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java index 3983e7677e78..f66bd6797be2 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java @@ -23,6 +23,7 @@ import com.intellij.xdebugger.impl.DebuggerSupport; import com.intellij.xdebugger.settings.XDebuggerSettings; import org.jetbrains.annotations.NotNull; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -65,14 +66,21 @@ public class DebuggerConfigurableProvider extends ConfigurableProvider { @NotNull static List getConfigurables(@NotNull XDebuggerSettings.Category category) { List providers = getSortedProviders(); - if (providers.isEmpty()) { - return Collections.emptyList(); - } + return providers.isEmpty() ? Collections.emptyList() : getConfigurables(category, providers); + } - List configurables = new SmartList(); + @NotNull + static List getConfigurables(@NotNull XDebuggerSettings.Category category, @NotNull List providers) { + List configurables = null; for (DebuggerSettingsPanelProvider provider : providers) { - configurables.addAll(provider.getConfigurable(category)); + Collection providerConfigurables = provider.getConfigurable(category); + if (!providerConfigurables.isEmpty()) { + if (configurables == null) { + configurables = new SmartList(); + } + configurables.addAll(providerConfigurables); + } } - return configurables.isEmpty() ? Collections.emptyList() : configurables; + return ContainerUtil.isEmpty(configurables) ? Collections.emptyList() : configurables; } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/SteppingConfigurable.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/SteppingConfigurable.java new file mode 100644 index 000000000000..eca20339a2d8 --- /dev/null +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/SteppingConfigurable.java @@ -0,0 +1,54 @@ +/* + * Copyright 2000-2014 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.xdebugger.impl.settings; + +import com.intellij.openapi.options.Configurable; +import com.intellij.xdebugger.XDebuggerBundle; +import com.intellij.xdebugger.settings.XDebuggerSettings; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +class SteppingConfigurable extends SubCompositeConfigurable implements Configurable.NoScroll { + public SteppingConfigurable(@NotNull List configurables) { + assert !configurables.isEmpty(); + children = configurables.toArray(new Configurable[configurables.size()]); + } + + @NotNull + @Override + public String getId() { + return "debugger.stepping"; + } + + @Nls + @Override + public String getDisplayName() { + return XDebuggerBundle.message("debugger.stepping.display.name"); + } + + @Override + protected DataViewsConfigurableUi createRootUi() { + return null; + } + + @NotNull + @Override + protected XDebuggerSettings.Category getCategory() { + return XDebuggerSettings.Category.STEPPING; + } +} \ No newline at end of file diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/SubCompositeConfigurable.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/SubCompositeConfigurable.java new file mode 100644 index 000000000000..a9c5ec6db4a6 --- /dev/null +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/SubCompositeConfigurable.java @@ -0,0 +1,178 @@ +/* + * Copyright 2000-2014 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.xdebugger.impl.settings; + +import com.intellij.openapi.options.Configurable; +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.options.SearchableConfigurable; +import com.intellij.openapi.ui.VerticalFlowLayout; +import com.intellij.ui.IdeBorderFactory; +import com.intellij.xdebugger.impl.DebuggerSupport; +import com.intellij.xdebugger.settings.XDebuggerSettings; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.util.List; + +abstract class SubCompositeConfigurable implements SearchableConfigurable.Parent { + protected DataViewsConfigurableUi root; + protected Configurable[] children; + protected JComponent rootComponent; + + @Override + public boolean hasOwnContent() { + return getCategory() != XDebuggerSettings.Category.STEPPING; + } + + @Override + public boolean isVisible() { + return true; + } + + @Nullable + @Override + public Runnable enableSearch(String option) { + return null; + } + + @Nullable + @Override + public String getHelpTopic() { + getConfigurables(); + return children != null && children.length == 1 ? children[0].getHelpTopic() : null; + } + + @Override + public final void disposeUIResources() { + root = null; + rootComponent = null; + + if (isChildrenMerged()) { + for (Configurable child : children) { + child.reset(); + } + } + children = null; + } + + protected XDebuggerDataViewSettings getSettings() { + return null; + } + + @Nullable + protected abstract DataViewsConfigurableUi createRootUi(); + + @NotNull + protected abstract XDebuggerSettings.Category getCategory(); + + private boolean isChildrenMerged() { + return children != null && (!getCategory().isSeparatePage() || children.length == 1); + } + + @Override + public final Configurable[] getConfigurables() { + if (children == null) { + List configurables = DebuggerConfigurableProvider.getConfigurables(getCategory()); + children = configurables.toArray(new Configurable[configurables.size()]); + } + return isChildrenMerged() ? DebuggerConfigurable.EMPTY_CONFIGURABLES : children; + } + + @Nullable + @Override + public final JComponent createComponent() { + if (rootComponent == null) { + if (root == null) { + root = createRootUi(); + } + + getConfigurables(); + if (isChildrenMerged()) { + if (children.length == 0) { + rootComponent = root == null ? null : root.getComponent(); + } + else if (root == null && children.length == 1) { + rootComponent = children[0].createComponent(); + } + else { + JPanel panel = new JPanel(new VerticalFlowLayout(0, IdeBorderFactory.TITLED_BORDER_BOTTOM_INSET)); + if (root != null) { + panel.add(root.getComponent()); + } + for (Configurable child : children) { + JComponent component = child.createComponent(); + if (component != null) { + component.setBorder(IdeBorderFactory.createTitledBorder(child.getDisplayName(), false)); + panel.add(component); + } + } + rootComponent = panel; + } + } + else { + rootComponent = root == null ? null : root.getComponent(); + } + } + return rootComponent; + } + + @Override + public final void reset() { + if (root != null) { + root.reset(getSettings()); + } + + if (isChildrenMerged()) { + for (Configurable child : children) { + child.reset(); + } + } + } + + @Override + public final boolean isModified() { + if (root != null && root.isModified(getSettings())) { + return true; + } + else if (isChildrenMerged()) { + for (Configurable child : children) { + if (child.isModified()) { + return true; + } + } + } + return false; + } + + @Override + public final void apply() throws ConfigurationException { + if (root != null) { + root.apply(getSettings()); + for (DebuggerSupport support : DebuggerSupport.getDebuggerSupports()) { + support.getSettingsPanelProvider().applied(getCategory()); + } + } + + if (isChildrenMerged()) { + for (Configurable child : children) { + if (child.isModified()) { + child.apply(); + } + } + } + } +} \ No newline at end of file diff --git a/resources-en/src/messages/DebuggerBundle.properties b/resources-en/src/messages/DebuggerBundle.properties index 26d078746bef..0b7069199dcc 100644 --- a/resources-en/src/messages/DebuggerBundle.properties +++ b/resources-en/src/messages/DebuggerBundle.properties @@ -206,7 +206,6 @@ label.compound.renderer.configurable.table.header.name=Name label.compound.renderer.configurable.table.header.expression=Expression debugger.launching.configurable.display.name=Launching debugger.hotswap.configurable.display.name=HotSwap -debugger.stepping.configurable.display.name=Stepping label.debugger.launching.configurable.hide.window=Hide debug &window on process termination label.debugger.focusAppOnBreakpoint=Focus application on breakpoint label.debugger.hotswap.configurable.hotswap.background=Reload classes in &background From 91f505e2f76c26f46263d4435f0283132caa5b87 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 21 Jul 2014 19:04:30 +0200 Subject: [PATCH 53/69] create static method from usage in interface (IDEA-127563) --- .../CreateAbstractMethodFromUsageFix.java | 2 +- .../impl/quickfix/CreateFromUsageBaseFix.java | 3 +++ .../quickfix/CreateMethodFromUsageFix.java | 19 ++++++++++--------- .../afterStaticInInterface.java | 10 ++++++++++ .../beforeStaticInInterface.java | 6 ++++++ 5 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/afterStaticInInterface.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/beforeStaticInInterface.java diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateAbstractMethodFromUsageFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateAbstractMethodFromUsageFix.java index abcff2238c68..5edd1973cfd8 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateAbstractMethodFromUsageFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateAbstractMethodFromUsageFix.java @@ -51,7 +51,7 @@ public class CreateAbstractMethodFromUsageFix extends CreateMethodFromUsageFix { } @Override - protected boolean shouldBeAbstract(PsiClass targetClass) { + protected boolean shouldBeAbstract(PsiReferenceExpression expression, PsiClass targetClass) { return true; } } diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java index c12fbe8d7711..09b83e2a489f 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java @@ -168,6 +168,9 @@ public abstract class CreateFromUsageBaseFix extends BaseIntentionAction { list.deleteChildRange(list.getFirstChild(), list.getLastChild()); return; } + if (targetClass.isInterface()) { + return; + } final String visibility = getVisibility(parentClass, targetClass); if (VisibilityUtil.ESCALATE_VISIBILITY.equals(visibility)) { list.setModifierProperty(PsiModifier.PRIVATE, true); diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java index b7cd8af73084..8e93a6a0c817 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java @@ -120,7 +120,7 @@ public class CreateMethodFromUsageFix extends CreateFromUsageBaseFix { PsiMethodCallExpression call = getMethodCall(); if (call == null) return Collections.emptyList(); for (PsiClass target : targets) { - if (target.isInterface() && shouldCreateStaticMember(call.getMethodExpression(), target)) continue; + if (target.isInterface() && shouldCreateStaticMember(call.getMethodExpression(), target) && !PsiUtil.isLanguageLevel8OrHigher(target)) continue; if (!isMethodSignatureExists(call, target)) { result.add(target); } @@ -155,7 +155,8 @@ public class CreateMethodFromUsageFix extends CreateFromUsageBaseFix { PsiCodeBlock body = method.getBody(); assert body != null; - if (shouldBeAbstract(targetClass)) { + final boolean shouldBeAbstract = shouldBeAbstract(expression.getMethodExpression(), targetClass); + if (shouldBeAbstract) { body.delete(); if (!targetClass.isInterface()) { method.getModifierList().setModifierProperty(PsiModifier.ABSTRACT, true); @@ -167,14 +168,14 @@ public class CreateMethodFromUsageFix extends CreateFromUsageBaseFix { expression = getMethodCall(); LOG.assertTrue(expression.isValid()); - if (!targetClass.isInterface() && shouldCreateStaticMember(expression.getMethodExpression(), targetClass) && !shouldBeAbstract(targetClass)) { + if ((!targetClass.isInterface() || PsiUtil.isLanguageLevel8OrHigher(targetClass)) && shouldCreateStaticMember(expression.getMethodExpression(), targetClass) && !shouldBeAbstract) { PsiUtil.setModifierProperty(method, PsiModifier.STATIC, true); } final PsiElement context = PsiTreeUtil.getParentOfType(expression, PsiClass.class, PsiMethod.class); PsiExpression[] arguments = expression.getArgumentList().getExpressions(); - doCreate(targetClass, method, shouldBeAbstract(targetClass), + doCreate(targetClass, method, shouldBeAbstract, ContainerUtil.map2List(arguments, Pair.createFunction(null)), getTargetSubstitutor(expression), CreateFromUsageUtils.guessExpectedTypes(expression, true), @@ -213,7 +214,7 @@ public class CreateMethodFromUsageFix extends CreateFromUsageBaseFix { public static void doCreate(PsiClass targetClass, PsiMethod method, List> arguments, PsiSubstitutor substitutor, ExpectedTypeInfo[] expectedTypes, @Nullable PsiElement context) { - doCreate(targetClass, method, shouldBeAbstractImpl(targetClass), arguments, substitutor, expectedTypes, context); + doCreate(targetClass, method, shouldBeAbstractImpl(null, targetClass), arguments, substitutor, expectedTypes, context); } public static void doCreate(PsiClass targetClass, @@ -340,12 +341,12 @@ public class CreateMethodFromUsageFix extends CreateFromUsageBaseFix { return false; } - protected boolean shouldBeAbstract(PsiClass targetClass) { - return shouldBeAbstractImpl(targetClass); + protected boolean shouldBeAbstract(PsiReferenceExpression expression, PsiClass targetClass) { + return shouldBeAbstractImpl(expression, targetClass); } - private static boolean shouldBeAbstractImpl(PsiClass targetClass) { - return targetClass.isInterface(); + private static boolean shouldBeAbstractImpl(PsiReferenceExpression expression, PsiClass targetClass) { + return targetClass.isInterface() && (expression == null || !shouldCreateStaticMember(expression, targetClass)); } @Override diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/afterStaticInInterface.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/afterStaticInInterface.java new file mode 100644 index 000000000000..66a2b59a9a10 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/afterStaticInInterface.java @@ -0,0 +1,10 @@ +// "Create Method 'f'" "true" +interface X { + public static void m() { + f(); + } + + static void f() { + + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/beforeStaticInInterface.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/beforeStaticInInterface.java new file mode 100644 index 000000000000..81afbe358fbe --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/beforeStaticInInterface.java @@ -0,0 +1,6 @@ +// "Create Method 'f'" "true" +interface X { + public static void m() { + f(); + } +} \ No newline at end of file From 4b7122b83d951e0f102590f99a511ad7c6062d86 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 21 Jul 2014 19:16:22 +0200 Subject: [PATCH 54/69] shorten FQNs when insert casts (IDEA-127573) --- .../daemon/impl/quickfix/AddTypeCastFix.java | 2 ++ .../quickFix/addTypeCast/afterShortenFQNs.java | 10 ++++++++++ .../quickFix/addTypeCast/beforeShortenFQNs.java | 8 ++++++++ 3 files changed, 20 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/afterShortenFQNs.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeShortenFQNs.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java index 0ccad5cadf48..9fc35a649504 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java @@ -31,6 +31,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; +import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; import org.jetbrains.annotations.NotNull; @@ -91,6 +92,7 @@ public class AddTypeCastFix extends LocalQuickFixAndIntentionActionOnPsiElement String text = "(" + type.getCanonicalText(false) + ")value"; PsiElementFactory factory = JavaPsiFacade.getInstance(original.getProject()).getElementFactory(); PsiTypeCastExpression typeCast = (PsiTypeCastExpression)factory.createExpressionFromText(text, original); + typeCast = (PsiTypeCastExpression)JavaCodeStyleManager.getInstance(project).shortenClassReferences(typeCast); typeCast = (PsiTypeCastExpression)CodeStyleManager.getInstance(project).reformat(typeCast); if (expression instanceof PsiConditionalExpression) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/afterShortenFQNs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/afterShortenFQNs.java new file mode 100644 index 000000000000..9fea89ffa684 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/afterShortenFQNs.java @@ -0,0 +1,10 @@ +import java.util.List; + +// "Cast parameter to 'java.util.List'" "true" +class Test { + void m(Object o) { + foo((List) o); + } + + private void foo(final java.util.List o) {} +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeShortenFQNs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeShortenFQNs.java new file mode 100644 index 000000000000..e53d8b1e6c31 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeShortenFQNs.java @@ -0,0 +1,8 @@ +// "Cast parameter to 'java.util.List'" "true" +class Test { + void m(Object o) { + foo(o); + } + + private void foo(final java.util.List o) {} +} From dd4ddfb83f76b650e4b5d49f0ae2e856a9d07e72 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 21 Jul 2014 20:35:45 +0200 Subject: [PATCH 55/69] method ref -> lambda: names based on resolved method (IDEA-126977) --- .../ReplaceMethodRefWithLambdaIntention.java | 30 ++++++++++++++----- .../methodRefs2lambda/Ambiguity_after.java | 2 +- .../ArrayMethodRef_after.java | 2 +- .../NewRefsInference1_after.java | 4 +-- .../NewRefsInference_after.java | 2 +- .../NewRefsInnerClass_after.java | 2 +- .../NewRefsStaticInnerClass_after.java | 2 +- .../methodRefs2lambda/Receiver_after.java | 2 +- .../types/methodRefs2lambda/Subst_after.java | 2 +- 9 files changed, 31 insertions(+), 17 deletions(-) diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/types/ReplaceMethodRefWithLambdaIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/types/ReplaceMethodRefWithLambdaIntention.java index 8ffc5eebfbe0..f26a41771228 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/types/ReplaceMethodRefWithLambdaIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/types/ReplaceMethodRefWithLambdaIntention.java @@ -19,6 +19,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; +import com.intellij.psi.codeStyle.SuggestedNameInfo; import com.intellij.psi.codeStyle.VariableKind; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; @@ -45,24 +46,38 @@ public class ReplaceMethodRefWithLambdaIntention extends Intention { protected void processIntention(@NotNull PsiElement element) throws IncorrectOperationException { final PsiMethodReferenceExpression referenceExpression = PsiTreeUtil.getParentOfType(element, PsiMethodReferenceExpression.class); LOG.assertTrue(referenceExpression != null); + final PsiElement resolve = referenceExpression.resolve(); + final boolean isReceiver = resolve instanceof PsiMethod && PsiMethodReferenceUtil.hasReceiver(referenceExpression, (PsiMethod)resolve); + final PsiParameter[] psiParameters = resolve instanceof PsiMethod ? ((PsiMethod)resolve).getParameterList().getParameters() : null; final PsiType functionalInterfaceType = referenceExpression.getFunctionalInterfaceType(); final PsiClassType.ClassResolveResult functionalInterfaceResolveResult = PsiUtil.resolveGenericsClassInType(functionalInterfaceType); final PsiMethod interfaceMethod = LambdaUtil.getFunctionalInterfaceMethod(functionalInterfaceType); + LOG.assertTrue(interfaceMethod != null); + final PsiSubstitutor psiSubstitutor = LambdaUtil.getSubstitutor(interfaceMethod, functionalInterfaceResolveResult); final StringBuilder buf = new StringBuilder("("); LOG.assertTrue(functionalInterfaceType != null); buf.append(functionalInterfaceType.getCanonicalText()).append(")("); - LOG.assertTrue(interfaceMethod != null); - final PsiParameter[] parameters = interfaceMethod.getParameterList().getParameters(); + final PsiParameterList parameterList = interfaceMethod.getParameterList(); + final PsiParameter[] parameters = parameterList.getParameters(); final Map map = new HashMap(); final JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(element.getProject()); final String paramsString = StringUtil.join(parameters, new Function() { @Override public String fun(PsiParameter parameter) { - String parameterName = parameter.getName(); - if (parameterName != null) { - final String baseName = codeStyleManager.variableNameToPropertyName(parameterName, VariableKind.PARAMETER); - parameterName = codeStyleManager.suggestUniqueVariableName(baseName, referenceExpression, true); + final int parameterIndex = parameterList.getParameterIndex(parameter); + String baseName; + if (isReceiver && parameterIndex == 0) { + final SuggestedNameInfo nameInfo = codeStyleManager.suggestVariableName(VariableKind.PARAMETER, null, null, psiSubstitutor.substitute(parameter.getType())); + baseName = nameInfo.names.length > 0 ? nameInfo.names[0] : parameter.getName(); + } + else { + final String initialName = psiParameters != null ? psiParameters[parameterIndex - (isReceiver ? 1 : 0)].getName() : parameter.getName(); + baseName = codeStyleManager.variableNameToPropertyName(initialName, VariableKind.PARAMETER); + } + + if (baseName != null) { + String parameterName = codeStyleManager.suggestUniqueVariableName(baseName, referenceExpression, true); map.put(parameter, parameterName); return parameterName; } @@ -92,11 +107,10 @@ public class ReplaceMethodRefWithLambdaIntention extends Intention { final boolean onArrayRef = JavaPsiFacade.getElementFactory(element.getProject()).getArrayClass(PsiUtil.getLanguageLevel(element)) == containingClass; - boolean isReceiver = PsiMethodReferenceUtil.isReceiverType(functionalInterfaceType, containingClass, resolveElement instanceof PsiMethod ? (PsiMethod)resolveElement : null); final PsiElement referenceNameElement = referenceExpression.getReferenceNameElement(); if (isReceiver){ - buf.append(parameters[0].getName()).append("."); + buf.append(map.get(parameters[0])).append("."); } else { if (!(referenceNameElement instanceof PsiKeyword)) { if (qualifier instanceof PsiTypeElement) { diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/Ambiguity_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/Ambiguity_after.java index b0e14f13dad8..2d27aef15301 100644 --- a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/Ambiguity_after.java +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/Ambiguity_after.java @@ -14,6 +14,6 @@ public class MyTest { static void call(int i, I2 s) {} public static void main(String[] args) { - call(1, (x) -> MyTest.m(x)); + call(1, (i) -> MyTest.m(i)); } } diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayMethodRef_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayMethodRef_after.java index 65a55a55e8aa..94c8d2f42151 100644 --- a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayMethodRef_after.java +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayMethodRef_after.java @@ -1,6 +1,6 @@ public class Foo { static void foo() { - Cln j = (p) -> p.clone(); + Cln j = (ints) -> ints.clone(); } interface Cln { diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/NewRefsInference1_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/NewRefsInference1_after.java index b61947e47488..bd874395a9f5 100644 --- a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/NewRefsInference1_after.java +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/NewRefsInference1_after.java @@ -10,8 +10,8 @@ public class MyTest { static void m(I s) {} static { - m((s) -> { - new Foo(s); + m((x) -> { + new Foo(x); }); } } diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/NewRefsInference_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/NewRefsInference_after.java index 22e5bef35348..cd937894625e 100644 --- a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/NewRefsInference_after.java +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/NewRefsInference_after.java @@ -11,6 +11,6 @@ public class MyTest { } static { - I s = (z) -> new MyTest(z); + I s = (x) -> new MyTest(x); } } \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/NewRefsInnerClass_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/NewRefsInnerClass_after.java index 600af263857a..0d1106d8e4b6 100644 --- a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/NewRefsInnerClass_after.java +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/NewRefsInnerClass_after.java @@ -8,6 +8,6 @@ class MyTest { } static { - I i1 = (receiver) -> new Inner(receiver); + I i1 = (mt) -> new Inner(mt); } } diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/NewRefsStaticInnerClass_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/NewRefsStaticInnerClass_after.java index fdce48211ed4..c26cd8a6d244 100644 --- a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/NewRefsStaticInnerClass_after.java +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/NewRefsStaticInnerClass_after.java @@ -10,6 +10,6 @@ class MyTest { static { - I i1 = (receiver) -> new Inner(receiver); + I i1 = (outer) -> new Inner(outer); } } diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/Receiver_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/Receiver_after.java index 9f5bcafa929d..5b3eaf82c2b9 100644 --- a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/Receiver_after.java +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/Receiver_after.java @@ -11,6 +11,6 @@ public class MyTest { } static { - I i = (I) (receiver) -> receiver.m(); + I i = (I) (myTest) -> myTest.m(); } } diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/Subst_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/Subst_after.java index c719ccefa15b..2ff6feee03b9 100644 --- a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/Subst_after.java +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/Subst_after.java @@ -5,5 +5,5 @@ class Bar { } class Test { - Comparator comparator = (o1, o2) -> o1.xxx(o2); + Comparator comparator = (bar, p) -> bar.xxx(p); } \ No newline at end of file From bacc3c2ad63a55333672104573022a52b37af3cd Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 21 Jul 2014 20:47:52 +0200 Subject: [PATCH 56/69] lambda -> method refs: collapse when acceptable method without supers found --- .../LambdaCanBeMethodReferenceInspection.java | 11 +++++++---- .../afterAmbiguityWithoutSuperMethods.java | 11 +++++++++++ .../beforeAmbiguityWithoutSuperMethods.java | 11 +++++++++++ 3 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/afterAmbiguityWithoutSuperMethods.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeAmbiguityWithoutSuperMethods.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/LambdaCanBeMethodReferenceInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/LambdaCanBeMethodReferenceInspection.java index 1e887030dcb4..416226e9ac8f 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/LambdaCanBeMethodReferenceInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/LambdaCanBeMethodReferenceInspection.java @@ -245,11 +245,14 @@ public class LambdaCanBeMethodReferenceInspection extends BaseJavaBatchLocalInsp PsiParameter[] candidateParams = method.getParameterList().getParameters(); if (candidateParams.length == 1) { if (TypeConversionUtil.areTypesConvertible(candidateParams[0].getType(), parameters[0].getType())) { - for (PsiMethod superMethod : psiMethod.findDeepestSuperMethods()) { - PsiMethod validSuperMethod = ensureNonAmbiguousMethod(parameters, superMethod); - if (validSuperMethod != null) return validSuperMethod; + final PsiMethod[] deepestSuperMethods = psiMethod.findDeepestSuperMethods(); + if (deepestSuperMethods.length > 0) { + for (PsiMethod superMethod : deepestSuperMethods) { + PsiMethod validSuperMethod = ensureNonAmbiguousMethod(parameters, superMethod); + if (validSuperMethod != null) return validSuperMethod; + } + return null; } - return null; } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/afterAmbiguityWithoutSuperMethods.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/afterAmbiguityWithoutSuperMethods.java new file mode 100644 index 000000000000..54310c8da75f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/afterAmbiguityWithoutSuperMethods.java @@ -0,0 +1,11 @@ +// "Replace lambda with method reference" "true" +import java.io.PrintStream; +import java.util.function.BiConsumer; + +class Test { + { + BiConsumer printer = PrintStream::println; + } + + +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeAmbiguityWithoutSuperMethods.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeAmbiguityWithoutSuperMethods.java new file mode 100644 index 000000000000..7c68e5ec9fbc --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeAmbiguityWithoutSuperMethods.java @@ -0,0 +1,11 @@ +// "Replace lambda with method reference" "true" +import java.io.PrintStream; +import java.util.function.BiConsumer; + +class Test { + { + BiConsumer printer = (printStream, x) -> printStream.println(x); + } + + +} From d203d8f9371a5d284b1bab09e85b1777427c46fb Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 21 Jul 2014 21:51:56 +0200 Subject: [PATCH 57/69] bytecode-inferred annotations are only available for compiled elements (IDEA-127608) --- .../bytecodeAnalysis/ProjectBytecodeAnalysis.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ProjectBytecodeAnalysis.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ProjectBytecodeAnalysis.java index 0b985b485c68..86b9dd101fd9 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ProjectBytecodeAnalysis.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ProjectBytecodeAnalysis.java @@ -141,6 +141,9 @@ public class ProjectBytecodeAnalysis { @Nullable public PsiAnnotation findInferredAnnotation(@NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQN) { + if (!(listOwner instanceof PsiCompiledElement)) { + return null; + } if (annotationFQN.equals("org.jetbrains.annotations.NotNull")) { return findNotNullAnnotation(listOwner); } @@ -154,6 +157,9 @@ public class ProjectBytecodeAnalysis { @NotNull public PsiAnnotation[] findInferredAnnotations(@NotNull PsiModifierListOwner listOwner) { + if (!(listOwner instanceof PsiCompiledElement)) { + return PsiAnnotation.EMPTY_ARRAY; + } return collectInferredAnnotations(listOwner); } @@ -249,6 +255,8 @@ public class ProjectBytecodeAnalysis { } public static int getKey(@NotNull PsiModifierListOwner owner) throws IOException { + LOG.assertTrue(owner instanceof PsiCompiledElement, owner); + if (owner instanceof PsiMethod) { return BytecodeAnalysisConverter.getInstance().mkPsiKey((PsiMethod)owner, new Out()); } From c0d216205bf5b358fb1513138d3d71ba11241024 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 21 Jul 2014 22:14:07 +0200 Subject: [PATCH 58/69] EA-58395 - NPE: PerlMatcher.matches --- .../src/com/intellij/ide/actions/SearchEverywhereAction.java | 5 +++-- .../com/intellij/ide/util/gotoByName/GotoActionModel.java | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywhereAction.java b/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywhereAction.java index 5b82a62ae910..e1d5582204df 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywhereAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywhereAction.java @@ -1796,8 +1796,9 @@ public class SearchEverywhereAction extends AnAction implements CustomComponentA GotoActionModel model = new GotoActionModel(project, myFocusComponent, myEditor, myFile) { @Override protected MatchMode actionMatches(String pattern, @NotNull AnAction anAction) { - return NameUtil.buildMatcher("*" + pattern, NameUtil.MatchingCaseSensitivity.NONE) - .matches(anAction.getTemplatePresentation().getText()) ? MatchMode.NAME : MatchMode.NONE; + String text = anAction.getTemplatePresentation().getText(); + return text != null && NameUtil.buildMatcher("*" + pattern, NameUtil.MatchingCaseSensitivity.NONE) + .matches(text) ? MatchMode.NAME : MatchMode.NONE; } }; return new GotoActionItemProvider(model); diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionModel.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionModel.java index 8a4ad83395cb..91f0d3368521 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionModel.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionModel.java @@ -459,7 +459,7 @@ public class GotoActionModel implements ChooseByNameModel, CustomMatcherModel, C } final String groupName = myActionsMap.get(anAction); if (groupName == null) { - return matcher.matches(text, compiledPattern) ? MatchMode.NON_MENU : MatchMode.NONE; + return text != null && matcher.matches(text, compiledPattern) ? MatchMode.NON_MENU : MatchMode.NONE; } return text != null && matcher.matches(groupName + " " + text, compiledPattern) ? MatchMode.GROUP : MatchMode.NONE; } From 931d60065e8fadd4ff0df9ba900254698f5f07dd Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Tue, 22 Jul 2014 08:48:22 +0400 Subject: [PATCH 59/69] Inspections ui: expand/collapse tree fixed --- .../ui/SingleInspectionProfilePanel.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java index 080a3cc4e089..a910f6d596d2 100644 --- a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java +++ b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java @@ -541,7 +541,17 @@ public class SingleInspectionProfilePanel extends JPanel { } }); - myTreeExpander = new DefaultTreeExpander(myTreeTable.getTree()); + myTreeExpander = new DefaultTreeExpander(myTreeTable.getTree()) { + @Override + public boolean canExpand() { + return myTreeTable.isShowing(); + } + + @Override + public boolean canCollapse() { + return myTreeTable.isShowing(); + } + }; myProfileFilter = new MyFilterComponent(); return scrollPane; From df51a0d2909bee6343884ec52c693864976c8d36 Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Tue, 22 Jul 2014 09:08:41 +0400 Subject: [PATCH 60/69] Inspections settings ui: severity colors in tree showed only for enabled inspections --- .../ui/inspectionsTree/InspectionsConfigTreeTable.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/inspectionsTree/InspectionsConfigTreeTable.java b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/inspectionsTree/InspectionsConfigTreeTable.java index 60a173bdd1bc..966a456e1d38 100644 --- a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/inspectionsTree/InspectionsConfigTreeTable.java +++ b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/inspectionsTree/InspectionsConfigTreeTable.java @@ -149,8 +149,10 @@ public class InspectionsConfigTreeTable extends TreeTable { final MultiColoredHighlightSeverityIconSink sink = new MultiColoredHighlightSeverityIconSink(); for (final HighlightDisplayKey selectedInspectionsNode : inspectionsKeys) { final String toolId = selectedInspectionsNode.toString(); - sink.put(mySettings.getInspectionProfile().getToolDefaultState(toolId, mySettings.getProject()), - mySettings.getInspectionProfile().getNonDefaultTools(toolId, mySettings.getProject())); + if (mySettings.getInspectionProfile().getTools(toolId, mySettings.getProject()).isEnabled()) { + sink.put(mySettings.getInspectionProfile().getToolDefaultState(toolId, mySettings.getProject()), + mySettings.getInspectionProfile().getNonDefaultTools(toolId, mySettings.getProject())); + } } return sink.constructIcon(); } else if (column == IS_ENABLED_COLUMN) { @@ -207,6 +209,9 @@ public class InspectionsConfigTreeTable extends TreeTable { private boolean myIsFirst = true; public Icon constructIcon() { + if (myScopeToAverageSeverityMap.isEmpty()) { + return null; + } //TODO order scopes return !allScopesHasMixedSeverity() ? new MultiScopeSeverityIcon(myScopeToAverageSeverityMap) From 359bc9496c14f73b85717b852f83ed88142e5a9f Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 21 Jul 2014 19:54:08 +0400 Subject: [PATCH 61/69] DirectoryInfo simplification: use booleans instead of bit flags because now we have no so many instance of this class (CR-IC-5807) --- .../openapi/roots/impl/DirectoryInfo.java | 49 ++++++++++--------- .../roots/impl/NonProjectDirectoryInfo.java | 13 +++-- .../openapi/roots/impl/RootIndex.java | 4 +- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java index 213f3e716c23..157438cd3e81 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java @@ -22,7 +22,6 @@ import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.RootPolicy; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.BitUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -34,27 +33,32 @@ import java.util.Comparator; import java.util.List; public abstract class DirectoryInfo { - public static final int MAX_ROOT_TYPE_ID = (1 << (Byte.SIZE - 3)) - 1; + public static final int MAX_ROOT_TYPE_ID = Byte.MAX_VALUE; private final Module module; // module to which content it belongs or null private final VirtualFile libraryClassRoot; // class root in library private final VirtualFile contentRoot; private final VirtualFile sourceRoot; - - private static final byte MODULE_SOURCE_FLAG = 1; // set if files in this directory belongs to sources of the module (if field 'module' is not null) - private static final byte LIBRARY_SOURCE_FLAG = 2; // set if it's a directory with sources of some library - private static final byte EXCLUDED_FLAG = 4; // set if it's a directory under 'excluded' folder of a module - private final byte rootTypeData;//three least significant bits are used for MODULE_SOURCE_FLAG, LIBRARY_SOURCE_FLAG and EXCLUDED_FLAG, the remaining bits store module root type id (source/tests/resources/...) + private boolean myInModuleSource; + private boolean myInLibrarySource; + private boolean myExcluded; + private byte mySourceRootTypeId; DirectoryInfo(Module module, VirtualFile contentRoot, VirtualFile sourceRoot, VirtualFile libraryClassRoot, - byte rootTypeData) { + boolean inModuleSource, boolean inLibrarySource, boolean isExcluded, int sourceRootTypeId) { this.module = module; this.libraryClassRoot = libraryClassRoot; this.contentRoot = contentRoot; this.sourceRoot = sourceRoot; - this.rootTypeData = rootTypeData; + myInModuleSource = inModuleSource; + myInLibrarySource = inLibrarySource; + myExcluded = isExcluded; + if (sourceRootTypeId > MAX_ROOT_TYPE_ID) { + throw new IllegalArgumentException("Module source root type id " + sourceRootTypeId + " exceeds the maximum allowable value (" + MAX_ROOT_TYPE_ID + ")"); + } + mySourceRootTypeId = (byte)sourceRootTypeId; } /** @@ -78,7 +82,10 @@ public abstract class DirectoryInfo { DirectoryInfo info = (DirectoryInfo)o; - return rootTypeData == info.rootTypeData && + return mySourceRootTypeId == info.mySourceRootTypeId && + myInModuleSource == info.myInModuleSource && + myInLibrarySource == info.myInLibrarySource && + myExcluded == info.myExcluded && Comparing.equal(contentRoot, info.contentRoot) && Comparing.equal(libraryClassRoot, info.libraryClassRoot) && Comparing.equal(module, info.module) && @@ -92,7 +99,10 @@ public abstract class DirectoryInfo { result = 31 * result + (libraryClassRoot != null ? libraryClassRoot.hashCode() : 0); result = 31 * result + (contentRoot != null ? contentRoot.hashCode() : 0); result = 31 * result + (sourceRoot != null ? sourceRoot.hashCode() : 0); - result = 31 * result + (int)rootTypeData; + result = 31 * result + (myInModuleSource ? 1 : 0); + result = 31 * result + (myInLibrarySource ? 1 : 0); + result = 31 * result + (myExcluded ? 1 : 0); + result = 31 * result + (int)mySourceRootTypeId; return result; } @@ -230,15 +240,15 @@ public abstract class DirectoryInfo { } public boolean isInModuleSource() { - return BitUtil.isSet(rootTypeData, MODULE_SOURCE_FLAG); + return myInModuleSource; } public boolean isInLibrarySource() { - return BitUtil.isSet(rootTypeData, LIBRARY_SOURCE_FLAG); + return myInLibrarySource; } public boolean isExcluded() { - return BitUtil.isSet(rootTypeData, EXCLUDED_FLAG); + return myExcluded; } public Module getModule() { @@ -254,15 +264,6 @@ public abstract class DirectoryInfo { } public int getSourceRootTypeId() { - return rootTypeData >> 3; - } - - public static int createRootTypeData(boolean isInModuleSources, boolean isInLibrarySource, boolean isExcludedFromModule, - int moduleSourceRootTypeId) { - if (moduleSourceRootTypeId > MAX_ROOT_TYPE_ID) { - throw new IllegalArgumentException("Module source root type id " + moduleSourceRootTypeId + " exceeds the maximum allowable value (" + MAX_ROOT_TYPE_ID + ")"); - } - return (isInModuleSources ? MODULE_SOURCE_FLAG : 0) | (isInLibrarySource ? LIBRARY_SOURCE_FLAG : 0) | (isExcludedFromModule ? EXCLUDED_FLAG : 0) - | moduleSourceRootTypeId << 3; + return mySourceRootTypeId; } } diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/NonProjectDirectoryInfo.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/NonProjectDirectoryInfo.java index bde42e695238..d455e46be467 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/NonProjectDirectoryInfo.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/NonProjectDirectoryInfo.java @@ -33,19 +33,18 @@ class NonProjectDirectoryInfo extends DirectoryInfo { return true; } }; - public static final NonProjectDirectoryInfo EXCLUDED = new NonProjectDirectoryInfo("excluded from project") { - @Override - public boolean isExcluded() { - return true; - } - }; + public static final NonProjectDirectoryInfo EXCLUDED = new NonProjectDirectoryInfo("excluded from project", true); public static final NonProjectDirectoryInfo NOT_UNDER_PROJECT_ROOTS = new NonProjectDirectoryInfo("not under project roots"); public static final NonProjectDirectoryInfo INVALID = new NonProjectDirectoryInfo("invalid"); public static final NonProjectDirectoryInfo NOT_SUPPORTED_VIRTUAL_FILE_IMPLEMENTATION = new NonProjectDirectoryInfo("not supported VirtualFile implementation"); private final String myDebugName; private NonProjectDirectoryInfo(String debugName) { - super(null, null, null, null, (byte)0); + this(debugName, false); + } + + private NonProjectDirectoryInfo(String debugName, boolean isExcluded) { + super(null, null, null, null, false, false, isExcluded, 0); myDebugName = debugName; } diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java index a117e5fdac42..8c45a83f0949 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java @@ -595,8 +595,8 @@ public class RootIndex extends DirectoryIndex { int typeId = moduleSourceRoot != null ? info.rootTypeId.get(moduleSourceRoot) : 0; Module module = parentModuleForExcluded != null ? parentModuleForExcluded : info.contentRootOf.get(moduleContentRoot); - byte rootTypeData = (byte)DirectoryInfo.createRootTypeData(inModuleSources, inLibrarySource, parentModuleForExcluded != null, typeId); - DirectoryInfo directoryInfo = new DirectoryInfo(module, moduleContentRoot, sourceRoot, libraryClassRoot, rootTypeData) { + DirectoryInfo directoryInfo = new DirectoryInfo(module, moduleContentRoot, sourceRoot, libraryClassRoot, inModuleSources, inLibrarySource, + parentModuleForExcluded != null, typeId) { @NotNull @Override public OrderEntry[] getOrderEntries() { From 90d58bef51853400f5b2d75d6d07dc1c151bb733 Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 21 Jul 2014 20:24:30 +0400 Subject: [PATCH 62/69] DirectoryIndex: removed unnecessary isProjectExcludeRoot method --- .../roots/impl/DirectoryIndexTest.java | 69 +++++++------------ .../roots/impl/DirectoryIndexImpl.java | 8 --- .../openapi/roots/impl/DirectoryIndex.java | 2 - .../openapi/roots/impl/RootIndex.java | 5 -- 4 files changed, 24 insertions(+), 60 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java b/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java index 318126d84e62..ec018fcb93aa 100644 --- a/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java +++ b/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java @@ -537,11 +537,6 @@ public class DirectoryIndexTest extends IdeaTestCase { checkExcluded(projectOutput, myModule); checkExcluded(module2Output, myModule); checkExcluded(module2TestOutput, myModule2); - - assertFalse(myIndex.isProjectExcludeRoot(excluded)); - assertFalse(myIndex.isProjectExcludeRoot(projectOutput)); - assertFalse(myIndex.isProjectExcludeRoot(module2Output)); - assertFalse(myIndex.isProjectExcludeRoot(module2TestOutput)); excluded.delete(this); projectOutput.delete(this); @@ -556,43 +551,23 @@ public class DirectoryIndexTest extends IdeaTestCase { String fileName = e.getFileName(); checkExcluded(file, fileName.contains("module2TestOutput") ? myModule2 : myModule); created.add(file); - - if (fileName.equals("projectOutput")) { - assertFalse(myIndex.isProjectExcludeRoot(file)); - } - if (fileName.equals("module2Output")) { - assertFalse(myIndex.isProjectExcludeRoot(file)); - } - if (fileName.equals("module2TestOutput")) { - assertFalse(myIndex.isProjectExcludeRoot(file)); - } } }; VirtualFileManager.getInstance().addVirtualFileListener(l, getTestRootDisposable()); excluded = myModule1Dir.createChildDirectory(this, excluded.getName()); - assertFalse(myIndex.isProjectExcludeRoot(excluded)); - - projectOutput = myModule1Dir.createChildDirectory(this, projectOutput.getName()); - assertFalse(myIndex.isProjectExcludeRoot(projectOutput)); - - module2Output = myModule1Dir.createChildDirectory(this, module2Output.getName()); - assertFalse(myIndex.isProjectExcludeRoot(module2Output)); - - module2TestOutput = myModule2Dir.createChildDirectory(this, module2TestOutput.getName()); - assertFalse(myIndex.isProjectExcludeRoot(module2TestOutput)); - checkExcluded(excluded, myModule); + + projectOutput = myModule1Dir.createChildDirectory(this, projectOutput.getName()); checkExcluded(projectOutput, myModule); + + module2Output = myModule1Dir.createChildDirectory(this, module2Output.getName()); checkExcluded(module2Output, myModule); + + module2TestOutput = myModule2Dir.createChildDirectory(this, module2TestOutput.getName()); checkExcluded(module2TestOutput, myModule2); assertEquals(created.toString(), 4, created.size()); - - assertFalse(myIndex.isProjectExcludeRoot(excluded)); - assertFalse(myIndex.isProjectExcludeRoot(projectOutput)); - assertFalse(myIndex.isProjectExcludeRoot(module2Output)); - assertFalse(myIndex.isProjectExcludeRoot(module2TestOutput)); } public void testExcludesShouldBeRecognizedRightOnRefresh() throws Exception { @@ -690,9 +665,8 @@ public class DirectoryIndexTest extends IdeaTestCase { assertTrue(fileIndex.isIgnored(myOutputDir)); assertTrue(fileIndex.isIgnored(myModule1OutputDir)); assertFalse(fileIndex.isIgnored(myOutputDir.getParent())); - assertTrue(myIndex.isProjectExcludeRoot(myOutputDir)); - checkExcluded(myOutputDir, null); - assertFalse(myIndex.isProjectExcludeRoot(myModule1OutputDir)); + assertExcludedFromProject(myOutputDir); + assertExcludedFromProject(myModule1OutputDir); String moduleOutputUrl = myModule1OutputDir.getUrl(); myOutputDir.delete(this); @@ -701,10 +675,8 @@ public class DirectoryIndexTest extends IdeaTestCase { myOutputDir = myRootVFile.createChildDirectory(this, "out"); myModule1OutputDir = myOutputDir.createChildDirectory(this, "module1"); - assertTrue(myIndex.isProjectExcludeRoot(myOutputDir)); - checkExcluded(myOutputDir, null); - assertTrue(myIndex.isProjectExcludeRoot(myModule1OutputDir)); - checkExcluded(myModule1OutputDir, null); + assertExcludedFromProject(myOutputDir); + assertExcludedFromProject(myModule1OutputDir); assertTrue(fileIndex.isIgnored(myModule1OutputDir)); PsiTestUtil.setCompilerOutputPath(myModule, moduleOutputUrl, true); @@ -714,21 +686,20 @@ public class DirectoryIndexTest extends IdeaTestCase { PsiTestUtil.setCompilerOutputPath(myModule3, moduleOutputUrl, true); // now no module inherits project output dir, but it still should be project-excluded - assertTrue(myIndex.isProjectExcludeRoot(myOutputDir)); - checkExcluded(myOutputDir, null); + assertExcludedFromProject(myOutputDir); // project output inside module content shouldn't be projectExcludeRoot VirtualFile projectOutputUnderContent = myModule1Dir.createChildDirectory(this, "projectOutputUnderContent"); getCompilerProjectExtension().setCompilerOutputUrl(projectOutputUnderContent.getUrl()); fireRootsChanged(); - assertFalse(myIndex.isProjectExcludeRoot(myOutputDir)); - assertFalse(myIndex.isProjectExcludeRoot(projectOutputUnderContent)); - + assertNotExcluded(myOutputDir); + checkExcluded(projectOutputUnderContent, myModule); + projectOutputUnderContent.delete(this); projectOutputUnderContent = myModule1Dir.createChildDirectory(this, "projectOutputUnderContent"); - assertFalse(myIndex.isProjectExcludeRoot(myOutputDir)); - assertFalse(myIndex.isProjectExcludeRoot(projectOutputUnderContent)); + assertNotExcluded(myOutputDir); + checkExcluded(projectOutputUnderContent, myModule); } public void testFileContentAndSourceRoots() throws IOException { @@ -974,6 +945,14 @@ public class DirectoryIndexTest extends IdeaTestCase { return info; } + private void assertNotExcluded(VirtualFile dir) { + assertFalse(myIndex.getInfoForFile(dir).isExcluded()); + } + + private void assertExcludedFromProject(VirtualFile file) { + checkExcluded(file, null); + } + private void checkPackage(String packageName, boolean includeLibrarySources, VirtualFile... expectedDirs) { VirtualFile[] actualDirs = myIndex.getDirectoriesByPackageName(packageName, includeLibrarySources).toArray(VirtualFile.EMPTY_ARRAY); assertNotNull(actualDirs); diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexImpl.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexImpl.java index 30d1bb592c42..b1385686bc3a 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexImpl.java @@ -173,14 +173,6 @@ public class DirectoryIndexImpl extends DirectoryIndex { return null; } - @Override - public boolean isProjectExcludeRoot(@NotNull VirtualFile dir) { - checkAvailability(); - if (!(dir instanceof NewVirtualFile)) return false; - - return getRootIndex().isProjectExcludeRoot(dir); - } - @Override public String getPackageName(@NotNull VirtualFile dir) { checkAvailability(); diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryIndex.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryIndex.java index 215339ec4c8e..9fdd8e09a57d 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryIndex.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryIndex.java @@ -48,8 +48,6 @@ public abstract class DirectoryIndex { @Nullable public abstract JpsModuleSourceRootType getSourceRootType(@NotNull DirectoryInfo info); - public abstract boolean isProjectExcludeRoot(@NotNull VirtualFile dir); - @NotNull public abstract Query getDirectoriesByPackageName(@NotNull String packageName, boolean includeLibrarySources); diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java index 8c45a83f0949..5757d78e65cd 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java @@ -314,11 +314,6 @@ public class RootIndex extends DirectoryIndex { return info; } - @Override - public boolean isProjectExcludeRoot(@NotNull final VirtualFile dir) { - return myProjectExcludedRoots.contains(dir); - } - @Override @NotNull public Query getDirectoriesByPackageName(@NotNull final String packageName, final boolean includeLibrarySources) { From 73dfd9458246d70514d6c4d4d9bb79d84e16f495 Mon Sep 17 00:00:00 2001 From: Yaroslav Lepenkin Date: Tue, 22 Jul 2014 10:09:01 +0400 Subject: [PATCH 63/69] parameter name folding reducing: - do not inline if parameter length is less than 3 - do not inline if two subsequent parameters has interval names (beginIndex, endIndex; startId, endId; from, to...) --- .../folding/impl/JavaFoldingBuilderBase.java | 54 +----- .../impl/ParameterNameFoldingManager.java | 154 ++++++++++++++++++ .../folding/JavaFoldingTest.groovy | 56 +++++-- 3 files changed, 202 insertions(+), 62 deletions(-) create mode 100644 java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/ParameterNameFoldingManager.java diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilderBase.java b/java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilderBase.java index 9f5ecb109fd5..5e008afb4797 100644 --- a/java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilderBase.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilderBase.java @@ -45,7 +45,6 @@ import com.intellij.psi.util.*; import com.intellij.util.Function; import com.intellij.util.ObjectUtils; import com.intellij.util.text.CharArrayUtil; -import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -701,7 +700,7 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem else if (element instanceof PsiComment) { return settings.isCollapseEndOfLineComments(); } - else if (isLiteralExpression(element) + else if (ParameterNameFoldingManager.isLiteralExpression(element) && element.getParent() instanceof PsiExpressionList && (element.getParent().getParent() instanceof PsiCallExpression || element.getParent().getParent() instanceof PsiAnonymousClass)) { @@ -760,55 +759,8 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem if (quick || !JavaCodeFoldingSettings.getInstance().isInlineParameterNamesForLiteralCallArguments()) { return; } - PsiExpressionList callArgumentsList = expression.getArgumentList(); - if (callArgumentsList == null) { - return; - } - - PsiExpression[] callArguments = callArgumentsList.getExpressions(); - if (callArguments.length > 1) { - PsiParameter[] parameters = null; - boolean isResolved = false; - - for (int i = 0; i < callArguments.length; i++) { - PsiExpression callArgument = callArguments[i]; - - if (callArgument.getType() != null && isLiteralExpression(callArgument)) { - if (!isResolved) { - PsiMethod method = expression.resolveMethod(); - isResolved = true; - if (method == null) { - return; - } - parameters = method.getParameterList().getParameters(); - if (parameters.length != callArguments.length) { - return; - } - } - - PsiParameter methodParam = parameters[i]; - if (TypeConversionUtil.isAssignable(methodParam.getType(), callArgument.getType())) { - TextRange range = callArgument.getTextRange(); - String placeholderText = methodParam.getName() + ": " + callArgument.getText(); - foldElements.add(new NamedFoldingDescriptor(callArgument, range.getStartOffset(), range.getEndOffset(), null, placeholderText)); - } - } - } - } - } - - @Contract("null -> false") - private static boolean isLiteralExpression(@Nullable PsiElement callArgument) { - if (callArgument instanceof PsiLiteralExpression) - return true; - - if (callArgument instanceof PsiPrefixExpression) { - PsiPrefixExpression expr = (PsiPrefixExpression)callArgument; - IElementType tokenType = expr.getOperationTokenType(); - return JavaTokenType.MINUS.equals(tokenType) && expr.getOperand() instanceof PsiLiteralExpression; - } - - return false; + ParameterNameFoldingManager manager = new ParameterNameFoldingManager(expression); + foldElements.addAll(manager.buildDescriptors()); } private boolean addClosureFolding(final PsiClass aClass, final Document document, final List foldElements, diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/ParameterNameFoldingManager.java b/java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/ParameterNameFoldingManager.java new file mode 100644 index 000000000000..f643e9ee1110 --- /dev/null +++ b/java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/ParameterNameFoldingManager.java @@ -0,0 +1,154 @@ +/* + * Copyright 2000-2014 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.folding.impl; + +import com.intellij.lang.folding.FoldingDescriptor; +import com.intellij.lang.folding.NamedFoldingDescriptor; +import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.*; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.util.TypeConversionUtil; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class ParameterNameFoldingManager { + private static final int MIN_NAME_LENGTH_THRESHOLD = 3; + private static final int MIN_ARGS_TO_FOLD = 2; + + private static final String[] RANGE_START_WORDS = { + "begin", "start", "from", "first" + }; + private static final String[] RANGE_END_WORDS = { + "end", "to", "last" + }; + + private final PsiCallExpression myCallExpression; + + private PsiExpression[] myCallArguments; + private PsiParameter[] myParameters; + + public ParameterNameFoldingManager(@NotNull PsiCallExpression callExpression) { + myCallExpression = callExpression; + } + + public static boolean isLiteralExpression(@Nullable PsiElement callArgument) { + if (callArgument instanceof PsiLiteralExpression) + return true; + + if (callArgument instanceof PsiPrefixExpression) { + PsiPrefixExpression expr = (PsiPrefixExpression)callArgument; + IElementType tokenType = expr.getOperationTokenType(); + return JavaTokenType.MINUS.equals(tokenType) && expr.getOperand() instanceof PsiLiteralExpression; + } + + return false; + } + + @Nullable + public PsiExpression[] getArguments(@NotNull PsiCallExpression call) { + PsiExpressionList callArgumentsList = call.getArgumentList(); + return callArgumentsList != null ? callArgumentsList.getExpressions() : null; + } + + @NotNull + public List buildDescriptors() { + myCallArguments = getArguments(myCallExpression); + + if (myCallArguments != null && myCallArguments.length >= MIN_ARGS_TO_FOLD && hasLiteralExpression(myCallArguments)) { + PsiMethod method = myCallExpression.resolveMethod(); + + if (method != null) { + myParameters = method.getParameterList().getParameters(); + if (myParameters.length == myCallArguments.length) { + return buildDescriptorsForLiteralArguments(); + } + } + } + + return ContainerUtil.emptyList(); + } + + @NotNull + private List buildDescriptorsForLiteralArguments() { + List descriptors = ContainerUtil.newArrayList(); + + int i = 0; + while (i < myCallArguments.length) { + if (i + 1 < myCallArguments.length && isCommonlyNamedParameterPair(i, i + 1)) { + i += 2; + continue; + } + + if (shouldInlineParameterName(i)) { + descriptors.add(createFoldingDescriptor(myCallArguments[i], myParameters[i])); + } + i++; + } + + return descriptors; + } + + @NotNull + private static NamedFoldingDescriptor createFoldingDescriptor(@NotNull PsiExpression callArgument, @NotNull PsiParameter methodParam) { + TextRange range = callArgument.getTextRange(); + String placeholderText = methodParam.getName() + ": " + callArgument.getText(); + return new NamedFoldingDescriptor(callArgument, range.getStartOffset(), range.getEndOffset(), null, placeholderText); + } + + private boolean isCommonlyNamedParameterPair(int first, int second) { + assert first < myParameters.length && second < myParameters.length; + + String firstParamName = myParameters[first].getName(); + String secondParamName = myParameters[second].getName(); + if (firstParamName == null || secondParamName == null) return false; + + if (containsAnyWord(firstParamName, RANGE_START_WORDS) && containsAnyWord(secondParamName, RANGE_END_WORDS)) { + return true; + } + + return false; + } + + private static boolean containsAnyWord(@NotNull String str, @NotNull String[] words) { + for (String word : words) { + if (StringUtil.containsIgnoreCase(str, word)) return true; + } + return false; + } + + private boolean shouldInlineParameterName(int paramIndex) { + PsiExpression argument = myCallArguments[paramIndex]; + if (isLiteralExpression(argument) && argument.getType() != null) { + PsiParameter parameter = myParameters[paramIndex]; + String paramName = parameter.getName(); + if (paramName != null && paramName.length() >= MIN_NAME_LENGTH_THRESHOLD) { + return TypeConversionUtil.isAssignable(parameter.getType(), argument.getType()); + } + } + return false; + } + + private static boolean hasLiteralExpression(@NotNull PsiExpression[] arguments) { + for (PsiExpression argument : arguments) { + if (isLiteralExpression(argument)) return true; + } + return false; + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy index 2047f13b795d..7b877f7d0c22 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy @@ -608,7 +608,7 @@ class Test { configure(testNow, shouldIgnoreRoots(), fourteen, pi, title, c, file); } - pubic void configure(boolean testNow, boolean shouldIgnoreRoots, int times, float pi, String title, char terminate, File file) { + pubic void configure(boolean testNow, boolean shouldIgnoreRoots, int times, float pii, String title, char terminate, File file) { System.out.println(); System.out.println(); } @@ -672,7 +672,7 @@ public class VarArgTest { assert regions[1].placeholderText == "test: 13" } - public void "test inline if argument length is one (EA-57555)"() { + public void "test do not inline if parameter length is one or two"() { def text = """ public class CharSymbol { @@ -681,7 +681,7 @@ public class CharSymbol { count(1, false); } - public void count(int test, boolean fast) { + public void count(int t, boolean fa) { int temp = test; boolean isFast = fast; } @@ -689,13 +689,47 @@ public class CharSymbol { """ configure text def regions = myFixture.editor.foldingModel.allFoldRegions.sort { it.startOffset } - assert regions.size() == 4 + assert regions.size() == 2 + } - checkRangeOffsetByPositionInText(regions[1], text, "1") - assert regions[1].placeholderText == "test: 1" + public void "test do not inline paired ranged names"() { + def text = """ +public class CharSymbol { - checkRangeOffsetByPositionInText(regions[2], text, "false") - assert regions[2].placeholderText == "fast: false" + public void main() { + String s = "AAA"; + int last = 3; + + substring1(1, last); + substring2(1, last); + substring3(1, last); + substring4(1, last); + } + + public void substring1(int beginIndex, int endIndex) { + int start = beginIndex; + int end = endIndex; + } + + public void substring2(int startIndex, int endIndex) { + int start = beginIndex; + int end = endIndex; + } + + public void substring3(int from, int to) { + int start = beginIndex; + int end = endIndex; + } + + public void substring4(int first, int last) { + int start = beginIndex; + int end = endIndex; + } +} +""" + configure text + def regions = myFixture.editor.foldingModel.allFoldRegions.sort { it.startOffset } + assert regions.size() == 5 } public void "test inline names if literal expression can be assigned to method parameter"() { @@ -764,7 +798,7 @@ public class Test { } abstract class Checker { - Checker(boolean applyToFirst, boolean applyToSecond) {} + Checker(boolean isActive, boolean requestFocus) {} abstract void test(); } } @@ -773,8 +807,8 @@ public class Test { def regions = myFixture.editor.foldingModel.allFoldRegions.sort { it.startOffset } assert regions.length == 6 - assert regions[1].placeholderText == "applyToFirst: true" - assert regions[2].placeholderText == "applyToSecond: false" + assert regions[1].placeholderText == "isActive: true" + assert regions[2].placeholderText == "requestFocus: false" checkRangeOffsetByPositionInText(regions[1], text, "true") checkRangeOffsetByPositionInText(regions[2], text, "false") From a06bd8740798b65385a535b526388a848d950828 Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Tue, 22 Jul 2014 11:10:47 +0400 Subject: [PATCH 64/69] Inspections settings ui: added mask and fixed height of severity icon --- .../com/intellij/codeHighlighting/HighlightDisplayLevel.java | 4 ++-- .../ui/inspectionsTree/MultiScopeSeverityIcon.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/analysis-api/src/com/intellij/codeHighlighting/HighlightDisplayLevel.java b/platform/analysis-api/src/com/intellij/codeHighlighting/HighlightDisplayLevel.java index bf150428456e..75a2eca11e43 100644 --- a/platform/analysis-api/src/com/intellij/codeHighlighting/HighlightDisplayLevel.java +++ b/platform/analysis-api/src/com/intellij/codeHighlighting/HighlightDisplayLevel.java @@ -107,8 +107,8 @@ public class HighlightDisplayLevel { } } - private static class ImageHolder { - private static final Image ourErrorMaskImage = ImageLoader.loadFromResource("/general/errorMask.png"); + public static class ImageHolder { + public static final Image ourErrorMaskImage = ImageLoader.loadFromResource("/general/errorMask.png"); } private static final int EMPTY_ICON_DIM = 12; diff --git a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/inspectionsTree/MultiScopeSeverityIcon.java b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/inspectionsTree/MultiScopeSeverityIcon.java index b74352c6d737..6f093ca66349 100644 --- a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/inspectionsTree/MultiScopeSeverityIcon.java +++ b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/inspectionsTree/MultiScopeSeverityIcon.java @@ -46,7 +46,6 @@ public class MultiScopeSeverityIcon implements Icon { @Override public void paintIcon(final Component c, final Graphics g, final int i, final int j) { final int iconWidth = getIconWidth(); - final int iconHeightCoordinate = j + getIconHeight(); final int partWidth = iconWidth / myScopeToAverageSeverityMap.size(); @@ -57,9 +56,10 @@ public class MultiScopeSeverityIcon implements Icon { g.setColor(icon instanceof HighlightDisplayLevel.SingleColorIconWithMask ? ((HighlightDisplayLevel.SingleColorIconWithMask)icon).getColor() : MIXED_SEVERITY_COLOR); final int x = i + partWidth * idx; - g.fillRect(x, j, partWidth, iconHeightCoordinate); + g.fillRect(x, j, partWidth, getIconHeight()); idx++; } + g.drawImage(HighlightDisplayLevel.ImageHolder.ourErrorMaskImage, i, j, null); } @Override From 693b2a2c0307b5dc9606e5727a9286dc21419cd1 Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 22 Jul 2014 11:24:36 +0400 Subject: [PATCH 65/69] DirectoryIndexTest: renames --- .../roots/impl/DirectoryIndexTest.java | 134 +++++++++--------- 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java b/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java index ec018fcb93aa..e583daed6ed1 100644 --- a/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java +++ b/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java @@ -188,7 +188,7 @@ public class DirectoryIndexTest extends IdeaTestCase { } public void testDirInfos() throws IOException { - checkNotInProject(myRootVFile); + assertNotInProject(myRootVFile); // beware: files in directory index checkInfo(myFileLibSrc, null, false, true, "", null, myModule); @@ -206,21 +206,21 @@ public class DirectoryIndexTest extends IdeaTestCase { checkInfo(myLibSrcDir, myModule, false, true, "", null, myModule2, myModule3); checkInfo(myLibClsDir, myModule, true, false, "", null, myModule2, myModule3); - assertEquals(myLibSrcDir, checkInProject(myLibSrcDir).getSourceRoot()); + assertEquals(myLibSrcDir, assertInProject(myLibSrcDir).getSourceRoot()); checkInfo(myModule2Dir, myModule2, false, false, null, null); checkInfo(mySrcDir2, myModule2, false, false, "", JavaSourceRootType.SOURCE, myModule2, myModule3); - checkNotInProject(myCvsDir); - checkExcluded(myExcludeDir, myModule2); - checkExcluded(myExcludedLibClsDir, myModule); - checkExcluded(myExcludedLibSrcDir, myModule); + assertNotInProject(myCvsDir); + assertExcluded(myExcludeDir, myModule2); + assertExcluded(myExcludedLibClsDir, myModule); + assertExcluded(myExcludedLibSrcDir, myModule); - assertEquals(myModule1Dir, checkInProject(myLibClsDir).getContentRoot()); + assertEquals(myModule1Dir, assertInProject(myLibClsDir).getContentRoot()); checkInfo(myModule3Dir, myModule3, false, false, null, null); VirtualFile cvs = myPack1Dir.createChildDirectory(this, "CVS"); - checkNotInProject(cvs); + assertNotInProject(cvs); assertNull(ProjectRootManager.getInstance(myProject).getFileIndex().getPackageNameByDirectory(cvs)); } @@ -332,7 +332,7 @@ public class DirectoryIndexTest extends IdeaTestCase { VirtualFile newDir = myModule1Dir.createChildDirectory(this, "newDir"); myIndex.checkConsistency(); - checkInProject(newDir); + assertInProject(newDir); final FileTypeManagerEx fileTypeManager = (FileTypeManagerEx)FileTypeManager.getInstance(); final String list = fileTypeManager.getIgnoredFilesList(); @@ -345,7 +345,7 @@ public class DirectoryIndexTest extends IdeaTestCase { } }); myIndex.checkConsistency(); - checkNotInProject(newDir); + assertNotInProject(newDir); } finally { ApplicationManager.getApplication().runWriteAction(new Runnable() { @@ -354,7 +354,7 @@ public class DirectoryIndexTest extends IdeaTestCase { fileTypeManager.setIgnoredFilesList(list); } }); - checkInProject(newDir); + assertInProject(newDir); } } @@ -397,7 +397,7 @@ public class DirectoryIndexTest extends IdeaTestCase { ModuleManager moduleManager = ModuleManager.getInstance(myProject); Module module = moduleManager.newModule(myRootVFile.getPath() + "/newModule.iml", StdModuleTypes.JAVA.getId()); PsiTestUtil.addContentRoot(module, module4); - checkNotInProject(ignored); + assertNotInProject(ignored); checkInfo(module4, module, false, false, null, null); } }.execute().throwException(); @@ -445,20 +445,20 @@ public class DirectoryIndexTest extends IdeaTestCase { VirtualFile output1 = myModule1Dir.createChildDirectory(this, "output1"); VirtualFile output2 = myModule1Dir.createChildDirectory(this, "output2"); - checkInProject(output1); - checkInProject(output2); + assertInProject(output1); + assertInProject(output2); getCompilerProjectExtension().setCompilerOutputUrl(output1.getUrl()); fireRootsChanged(); - checkExcluded(output1, myModule); - checkInProject(output2); + assertExcluded(output1, myModule); + assertInProject(output2); getCompilerProjectExtension().setCompilerOutputUrl(output2.getUrl()); fireRootsChanged(); - checkInProject(output1); - checkExcluded(output2, myModule); + assertInProject(output1); + assertExcluded(output2, myModule); } private void fireRootsChanged() { @@ -482,7 +482,7 @@ public class DirectoryIndexTest extends IdeaTestCase { public void testModuleSourceAsLibraryClasses() throws Exception { ModuleRootModificationUtil.addModuleLibrary(myModule, "someLib", Arrays.asList(mySrcDir1.getUrl()), Collections.emptyList()); checkInfo(mySrcDir1, myModule, true, false, "", JavaSourceRootType.SOURCE, myModule); - assertInstanceOf(assertOneElement(checkInProject(mySrcDir1).getOrderEntries()), ModuleSourceOrderEntry.class); + assertInstanceOf(assertOneElement(assertInProject(mySrcDir1).getOrderEntries()), ModuleSourceOrderEntry.class); } public void testModulesWithSameSourceContentRoot() { @@ -512,7 +512,7 @@ public class DirectoryIndexTest extends IdeaTestCase { public void testSameSourceAndOutput() { PsiTestUtil.setCompilerOutputPath(myModule, mySrcDir1.getUrl(), false); - checkExcluded(mySrcDir1, myModule); + assertExcluded(mySrcDir1, myModule); } public void testExcludedDirShouldBeExcludedRightAfterItsCreation() throws Exception { @@ -521,10 +521,10 @@ public class DirectoryIndexTest extends IdeaTestCase { VirtualFile module2Output = myModule1Dir.createChildDirectory(this, "module2Output"); VirtualFile module2TestOutput = myModule2Dir.createChildDirectory(this, "module2TestOutput"); - checkInProject(excluded); - checkInProject(projectOutput); - checkInProject(module2Output); - checkInProject(module2TestOutput); + assertInProject(excluded); + assertInProject(projectOutput); + assertInProject(module2Output); + assertInProject(module2TestOutput); getCompilerProjectExtension().setCompilerOutputUrl(projectOutput.getUrl()); @@ -533,10 +533,10 @@ public class DirectoryIndexTest extends IdeaTestCase { PsiTestUtil.setCompilerOutputPath(myModule2, module2TestOutput.getUrl(), true); PsiTestUtil.setExcludeCompileOutput(myModule2, true); - checkExcluded(excluded, myModule); - checkExcluded(projectOutput, myModule); - checkExcluded(module2Output, myModule); - checkExcluded(module2TestOutput, myModule2); + assertExcluded(excluded, myModule); + assertExcluded(projectOutput, myModule); + assertExcluded(module2Output, myModule); + assertExcluded(module2TestOutput, myModule2); excluded.delete(this); projectOutput.delete(this); @@ -549,23 +549,23 @@ public class DirectoryIndexTest extends IdeaTestCase { public void fileCreated(@NotNull VirtualFileEvent e) { VirtualFile file = e.getFile(); String fileName = e.getFileName(); - checkExcluded(file, fileName.contains("module2TestOutput") ? myModule2 : myModule); + assertExcluded(file, fileName.contains("module2TestOutput") ? myModule2 : myModule); created.add(file); } }; VirtualFileManager.getInstance().addVirtualFileListener(l, getTestRootDisposable()); excluded = myModule1Dir.createChildDirectory(this, excluded.getName()); - checkExcluded(excluded, myModule); + assertExcluded(excluded, myModule); projectOutput = myModule1Dir.createChildDirectory(this, projectOutput.getName()); - checkExcluded(projectOutput, myModule); + assertExcluded(projectOutput, myModule); module2Output = myModule1Dir.createChildDirectory(this, module2Output.getName()); - checkExcluded(module2Output, myModule); + assertExcluded(module2Output, myModule); module2TestOutput = myModule2Dir.createChildDirectory(this, module2TestOutput.getName()); - checkExcluded(module2TestOutput, myModule2); + assertExcluded(module2TestOutput, myModule2); assertEquals(created.toString(), 4, created.size()); } @@ -591,9 +591,9 @@ public class DirectoryIndexTest extends IdeaTestCase { assertEquals("dir", e.getFileName()); VirtualFile file = e.getFile(); - checkInProject(file); - checkExcluded(file.findFileByRelativePath("excluded"), myModule); - checkExcluded(file.findFileByRelativePath("excluded/foo"), myModule); + assertInProject(file); + assertExcluded(file.findFileByRelativePath("excluded"), myModule); + assertExcluded(file.findFileByRelativePath("excluded/foo"), myModule); } }; @@ -622,8 +622,8 @@ public class DirectoryIndexTest extends IdeaTestCase { }); - checkExcluded(LocalFileSystem.getInstance().findFileByIoFile(f.getParentFile().getParentFile()), myModule); - checkInProject(LocalFileSystem.getInstance().findFileByIoFile(f)); + assertExcluded(LocalFileSystem.getInstance().findFileByIoFile(f.getParentFile().getParentFile()), myModule); + assertInProject(LocalFileSystem.getInstance().findFileByIoFile(f)); } public void testLibraryDirInContent() throws Exception { @@ -645,7 +645,7 @@ public class DirectoryIndexTest extends IdeaTestCase { checkInfo(myLibSrcDir, myModule, true, true, "", null, myModule, myModule3); checkInfo(myResDir, myModule, true, false, "", JavaResourceRootType.RESOURCE, myModule); - assertInstanceOf(assertOneElement(checkInProject(myResDir).getOrderEntries()), ModuleSourceOrderEntry.class); + assertInstanceOf(assertOneElement(assertInProject(myResDir).getOrderEntries()), ModuleSourceOrderEntry.class); checkInfo(myExcludedLibSrcDir, null, true, false, "lib.src.exc", null, myModule3, myModule); checkInfo(myExcludedLibClsDir, null, true, false, "lib.cls.exc", null, myModule3); @@ -694,12 +694,12 @@ public class DirectoryIndexTest extends IdeaTestCase { fireRootsChanged(); assertNotExcluded(myOutputDir); - checkExcluded(projectOutputUnderContent, myModule); + assertExcluded(projectOutputUnderContent, myModule); projectOutputUnderContent.delete(this); projectOutputUnderContent = myModule1Dir.createChildDirectory(this, "projectOutputUnderContent"); assertNotExcluded(myOutputDir); - checkExcluded(projectOutputUnderContent, myModule); + assertExcluded(projectOutputUnderContent, myModule); } public void testFileContentAndSourceRoots() throws IOException { @@ -709,7 +709,7 @@ public class DirectoryIndexTest extends IdeaTestCase { VirtualFile fileSourceRoot = myRootVFile.createChildData(this, "fileSourceRoot.txt"); VirtualFile fileTestSourceRoot = myRootVFile.createChildData(this, "fileTestSourceRoot.txt"); - checkNotInProject(fileRoot); + assertNotInProject(fileRoot); assertFalse(fileIndex.isInContent(fileRoot)); assertIteratedContent(fileIndex, null, Arrays.asList(fileRoot, fileSourceRoot, fileTestSourceRoot)); @@ -742,7 +742,7 @@ public class DirectoryIndexTest extends IdeaTestCase { // removing file content root PsiTestUtil.removeContentEntry(myModule, contentEntry); - checkNotInProject(fileRoot); + assertNotInProject(fileRoot); assertFalse(fileIndex.isInContent(fileRoot)); assertFalse(fileIndex.isInSource(fileRoot)); assertIteratedContent(fileIndex, Arrays.asList(fileSourceRoot, fileTestSourceRoot), Arrays.asList(fileRoot)); @@ -792,7 +792,7 @@ public class DirectoryIndexTest extends IdeaTestCase { PsiTestUtil.addExcludedRoot(myModule, fileExcludeRoot); assertFalse(fileIndex.isInContent(fileExcludeRoot)); assertFalse(fileIndex.isInSource(fileExcludeRoot)); - checkExcluded(fileExcludeRoot, myModule); + assertExcluded(fileExcludeRoot, myModule); assertIteratedContent(fileIndex, null, Arrays.asList(fileExcludeRoot)); // removing file exclude root @@ -813,7 +813,7 @@ public class DirectoryIndexTest extends IdeaTestCase { PsiTestUtil.addExcludedRoot(myModule, fileRoot); assertFalse(fileIndex.isInContent(fileRoot)); - checkExcluded(fileRoot, myModule); + assertExcluded(fileRoot, myModule); assertIteratedContent(fileIndex, null, Arrays.asList(fileRoot)); // removing file exclude root @@ -840,7 +840,7 @@ public class DirectoryIndexTest extends IdeaTestCase { VirtualFile temp = myRootVFile.createChildDirectory(this, "temp"); VirtualFile fileSourceRoot = myRootVFile.createChildData(this, "fileSourceRoot.txt"); - checkNotInProject(fileSourceRoot); + assertNotInProject(fileSourceRoot); PsiTestUtil.addContentRoot(myModule, fileSourceRoot); PsiTestUtil.addSourceRoot(myModule, fileSourceRoot); @@ -850,7 +850,7 @@ public class DirectoryIndexTest extends IdeaTestCase { // delete and recreate fileSourceRoot.delete(this); - checkNotInProject(fileSourceRoot); + assertNotInProject(fileSourceRoot); assertFalse(fileIndex.isInContent(fileSourceRoot)); assertFalse(fileIndex.isInSource(fileSourceRoot)); fileSourceRoot = myRootVFile.createChildData(this, "fileSourceRoot.txt"); @@ -860,11 +860,11 @@ public class DirectoryIndexTest extends IdeaTestCase { // delete and move from another dir fileSourceRoot.delete(this); - checkNotInProject(fileSourceRoot); + assertNotInProject(fileSourceRoot); assertFalse(fileIndex.isInContent(fileSourceRoot)); assertFalse(fileIndex.isInSource(fileSourceRoot)); fileSourceRoot = temp.createChildData(this, "fileSourceRoot.txt"); - checkNotInProject(fileSourceRoot); + assertNotInProject(fileSourceRoot); fileSourceRoot.move(this, myRootVFile); checkInfo(fileSourceRoot, myModule, false, false, "", JavaSourceRootType.SOURCE, myModule); assertTrue(fileIndex.isInContent(fileSourceRoot)); @@ -872,11 +872,11 @@ public class DirectoryIndexTest extends IdeaTestCase { // delete and copy from another dir fileSourceRoot.delete(this); - checkNotInProject(fileSourceRoot); + assertNotInProject(fileSourceRoot); assertFalse(fileIndex.isInContent(fileSourceRoot)); assertFalse(fileIndex.isInSource(fileSourceRoot)); fileSourceRoot = temp.createChildData(this, "fileSourceRoot.txt"); - checkNotInProject(fileSourceRoot); + assertNotInProject(fileSourceRoot); fileSourceRoot = fileSourceRoot.copy(this, myRootVFile, "fileSourceRoot.txt"); checkInfo(fileSourceRoot, myModule, false, false, "", JavaSourceRootType.SOURCE, myModule); assertTrue(fileIndex.isInContent(fileSourceRoot)); @@ -884,25 +884,25 @@ public class DirectoryIndexTest extends IdeaTestCase { // delete and rename from another file fileSourceRoot.delete(this); - checkNotInProject(fileSourceRoot); + assertNotInProject(fileSourceRoot); assertFalse(fileIndex.isInContent(fileSourceRoot)); assertFalse(fileIndex.isInSource(fileSourceRoot)); fileSourceRoot = myRootVFile.createChildData(this, "temp_file.txt"); - checkNotInProject(fileSourceRoot); + assertNotInProject(fileSourceRoot); fileSourceRoot.rename(this, "fileSourceRoot.txt"); checkInfo(fileSourceRoot, myModule, false, false, "", JavaSourceRootType.SOURCE, myModule); assertTrue(fileIndex.isInContent(fileSourceRoot)); assertTrue(fileIndex.isInSource(fileSourceRoot)); } - private void checkInfo(VirtualFile dir, + private void checkInfo(VirtualFile file, @Nullable Module module, boolean isInLibrary, boolean isInLibrarySource, @Nullable String packageName, @Nullable final JpsModuleSourceRootType moduleSourceRootType, Module... modulesOfOrderEntries) { - DirectoryInfo info = checkInProject(dir); + DirectoryInfo info = assertInProject(file); assertEquals(module, info.getModule()); if (moduleSourceRootType != null) { assertTrue("isInModuleSource", info.isInModuleSource()); @@ -915,8 +915,8 @@ public class DirectoryIndexTest extends IdeaTestCase { assertEquals(isInLibrarySource, info.isInLibrarySource()); final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(myProject).getFileIndex(); - if (dir.isDirectory()) { - assertEquals(packageName, fileIndex.getPackageNameByDirectory(dir)); + if (file.isDirectory()) { + assertEquals(packageName, fileIndex.getPackageNameByDirectory(file)); } assertEquals(Arrays.toString(info.getOrderEntries()), modulesOfOrderEntries.length, info.getOrderEntries().length); @@ -926,31 +926,31 @@ public class DirectoryIndexTest extends IdeaTestCase { } } - private void checkNotInProject(VirtualFile dir) { - DirectoryInfo info = myIndex.getInfoForFile(dir); + private void assertNotInProject(VirtualFile file) { + DirectoryInfo info = myIndex.getInfoForFile(file); assertFalse(info.toString(), info.isInProject()); assertFalse(info.toString(), info.isExcluded()); } - private void checkExcluded(VirtualFile dir, Module module) { - DirectoryInfo info = myIndex.getInfoForFile(dir); + private void assertExcluded(VirtualFile file, Module module) { + DirectoryInfo info = myIndex.getInfoForFile(file); assertTrue(info.toString(), info.isExcluded()); assertEquals(module, info.getModule()); } - private DirectoryInfo checkInProject(VirtualFile output2) { - DirectoryInfo info = myIndex.getInfoForFile(output2); - assertTrue(output2.toString(), info.isInProject()); + private DirectoryInfo assertInProject(VirtualFile file) { + DirectoryInfo info = myIndex.getInfoForFile(file); + assertTrue(file.toString(), info.isInProject()); info.assertConsistency(); return info; } - private void assertNotExcluded(VirtualFile dir) { - assertFalse(myIndex.getInfoForFile(dir).isExcluded()); + private void assertNotExcluded(VirtualFile file) { + assertFalse(myIndex.getInfoForFile(file).isExcluded()); } private void assertExcludedFromProject(VirtualFile file) { - checkExcluded(file, null); + assertExcluded(file, null); } private void checkPackage(String packageName, boolean includeLibrarySources, VirtualFile... expectedDirs) { From 41034f6b5da6ff759efcf36b4d9d55564e597344 Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 22 Jul 2014 12:15:09 +0400 Subject: [PATCH 66/69] DirectoryInfo: extracted sub-class --- .../openapi/roots/impl/DirectoryInfo.java | 237 ++-------------- .../openapi/roots/impl/DirectoryInfoImpl.java | 255 ++++++++++++++++++ .../roots/impl/NonProjectDirectoryInfo.java | 57 +++- .../openapi/roots/impl/RootIndex.java | 8 +- 4 files changed, 329 insertions(+), 228 deletions(-) create mode 100644 platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfoImpl.java diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java index 157438cd3e81..87448a584a23 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java @@ -18,252 +18,59 @@ package com.intellij.openapi.roots.impl; import com.intellij.openapi.module.Module; import com.intellij.openapi.roots.OrderEntry; -import com.intellij.openapi.roots.OrderRootType; -import com.intellij.openapi.roots.RootPolicy; -import com.intellij.openapi.util.Comparing; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; import java.util.List; public abstract class DirectoryInfo { - public static final int MAX_ROOT_TYPE_ID = Byte.MAX_VALUE; - private final Module module; // module to which content it belongs or null - private final VirtualFile libraryClassRoot; // class root in library - private final VirtualFile contentRoot; - private final VirtualFile sourceRoot; - private boolean myInModuleSource; - private boolean myInLibrarySource; - private boolean myExcluded; - private byte mySourceRootTypeId; - - DirectoryInfo(Module module, - VirtualFile contentRoot, - VirtualFile sourceRoot, - VirtualFile libraryClassRoot, - boolean inModuleSource, boolean inLibrarySource, boolean isExcluded, int sourceRootTypeId) { - this.module = module; - this.libraryClassRoot = libraryClassRoot; - this.contentRoot = contentRoot; - this.sourceRoot = sourceRoot; - myInModuleSource = inModuleSource; - myInLibrarySource = inLibrarySource; - myExcluded = isExcluded; - if (sourceRootTypeId > MAX_ROOT_TYPE_ID) { - throw new IllegalArgumentException("Module source root type id " + sourceRootTypeId + " exceeds the maximum allowable value (" + MAX_ROOT_TYPE_ID + ")"); - } - mySourceRootTypeId = (byte)sourceRootTypeId; - } - /** * @return {@code true} if located under project content or library roots and not excluded or ignored */ - public boolean isInProject() { - return !isExcluded(); - } + public abstract boolean isInProject(); /** * @return {@code true} if located under ignored directory */ - public boolean isIgnored() { - return false; - } + public abstract boolean isIgnored(); - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + /** + * @return {@code true} if located project content, output or library root but excluded from the project + */ + public abstract boolean isExcluded(); - DirectoryInfo info = (DirectoryInfo)o; + public abstract boolean isInModuleSource(); - return mySourceRootTypeId == info.mySourceRootTypeId && - myInModuleSource == info.myInModuleSource && - myInLibrarySource == info.myInLibrarySource && - myExcluded == info.myExcluded && - Comparing.equal(contentRoot, info.contentRoot) && - Comparing.equal(libraryClassRoot, info.libraryClassRoot) && - Comparing.equal(module, info.module) && - Arrays.equals(getOrderEntries(), info.getOrderEntries()) && - Comparing.equal(sourceRoot, info.sourceRoot); - } - - @Override - public int hashCode() { - int result = module != null ? module.hashCode() : 0; - result = 31 * result + (libraryClassRoot != null ? libraryClassRoot.hashCode() : 0); - result = 31 * result + (contentRoot != null ? contentRoot.hashCode() : 0); - result = 31 * result + (sourceRoot != null ? sourceRoot.hashCode() : 0); - result = 31 * result + (myInModuleSource ? 1 : 0); - result = 31 * result + (myInLibrarySource ? 1 : 0); - result = 31 * result + (myExcluded ? 1 : 0); - result = 31 * result + (int)mySourceRootTypeId; - return result; - } - - @SuppressWarnings({"HardCodedStringLiteral"}) - public String toString() { - return "DirectoryInfo{" + - "module=" + getModule() + - ", isInModuleSource=" + isInModuleSource() + - ", rootTypeId=" + getSourceRootTypeId() + - ", isInLibrarySource=" + isInLibrarySource() + - ", isExcludedFromModule=" + isExcluded() + - ", libraryClassRoot=" + getLibraryClassRoot() + - ", contentRoot=" + getContentRoot() + - ", sourceRoot=" + getSourceRoot() + - ", orderEntries=" + Arrays.toString(getOrderEntries()) + - "}"; - } - - @NotNull - public abstract OrderEntry[] getOrderEntries(); + public abstract boolean isInLibrarySource(); @Nullable - OrderEntry findOrderEntryWithOwnerModule(@NotNull Module ownerModule) { - OrderEntry[] entries = getOrderEntries(); - if (entries.length < 10) { - for (OrderEntry entry : entries) { - if (entry.getOwnerModule() == ownerModule) return entry; - } - return null; - } - int index = Arrays.binarySearch(entries, createFakeOrderEntry(ownerModule), BY_OWNER_MODULE); - return index < 0 ? null : entries[index]; - } + public abstract VirtualFile getSourceRoot(); - @NotNull - List findAllOrderEntriesWithOwnerModule(@NotNull Module ownerModule) { - OrderEntry[] entries = getOrderEntries(); - if (entries.length == 1) { - OrderEntry entry = entries[0]; - return entry.getOwnerModule() == ownerModule ? Arrays.asList(entries) : Collections.emptyList(); - } - int index = Arrays.binarySearch(entries, createFakeOrderEntry(ownerModule), BY_OWNER_MODULE); - if (index < 0) { - return Collections.emptyList(); - } - int firstIndex = index; - while (firstIndex-1 >= 0 && entries[firstIndex-1].getOwnerModule() == ownerModule) { - firstIndex--; - } - int lastIndex = index+1; - while (lastIndex < entries.length && entries[lastIndex].getOwnerModule() == ownerModule) { - lastIndex++; - } - - OrderEntry[] subArray = new OrderEntry[lastIndex - firstIndex]; - System.arraycopy(entries, firstIndex, subArray, 0, lastIndex - firstIndex); - - return Arrays.asList(subArray); - } - - @NotNull - private static OrderEntry createFakeOrderEntry(@NotNull final Module ownerModule) { - return new OrderEntry() { - @NotNull - @Override - public VirtualFile[] getFiles(OrderRootType type) { - throw new IncorrectOperationException(); - } - - @NotNull - @Override - public String[] getUrls(OrderRootType rootType) { - throw new IncorrectOperationException(); - } - - @NotNull - @Override - public String getPresentableName() { - throw new IncorrectOperationException(); - } - - @Override - public boolean isValid() { - throw new IncorrectOperationException(); - } - - @NotNull - @Override - public Module getOwnerModule() { - return ownerModule; - } - - @Override - public R accept(RootPolicy policy, @Nullable R initialValue) { - throw new IncorrectOperationException(); - } - - @Override - public int compareTo(@NotNull OrderEntry o) { - throw new IncorrectOperationException(); - } - - @Override - public boolean isSynthetic() { - throw new IncorrectOperationException(); - } - }; - } - - public static final Comparator BY_OWNER_MODULE = new Comparator() { - @Override - public int compare(OrderEntry o1, OrderEntry o2) { - String name1 = o1.getOwnerModule().getName(); - String name2 = o2.getOwnerModule().getName(); - return name1.compareTo(name2); - } - }; - - @Nullable - public VirtualFile getSourceRoot() { - return sourceRoot; - } - - public VirtualFile getLibraryClassRoot() { - return libraryClassRoot; - } + public abstract int getSourceRootTypeId(); public boolean hasLibraryClassRoot() { return getLibraryClassRoot() != null; } + public abstract VirtualFile getLibraryClassRoot(); + @Nullable - public VirtualFile getContentRoot() { - return contentRoot; - } + public abstract VirtualFile getContentRoot(); - public boolean isInModuleSource() { - return myInModuleSource; - } + @Nullable + public abstract Module getModule(); - public boolean isInLibrarySource() { - return myInLibrarySource; - } + @NotNull + public abstract OrderEntry[] getOrderEntries(); - public boolean isExcluded() { - return myExcluded; - } + @Nullable + abstract OrderEntry findOrderEntryWithOwnerModule(@NotNull Module ownerModule); - public Module getModule() { - return module; - } + @NotNull + abstract List findAllOrderEntriesWithOwnerModule(@NotNull Module ownerModule); @TestOnly - void assertConsistency() { - OrderEntry[] entries = getOrderEntries(); - for (int i=1; i BY_OWNER_MODULE = new Comparator() { + @Override + public int compare(OrderEntry o1, OrderEntry o2) { + String name1 = o1.getOwnerModule().getName(); + String name2 = o2.getOwnerModule().getName(); + return name1.compareTo(name2); + } + }; + public static final int MAX_ROOT_TYPE_ID = Byte.MAX_VALUE; + private final Module module; // module to which content it belongs or null + private final VirtualFile libraryClassRoot; // class root in library + private final VirtualFile contentRoot; + private final VirtualFile sourceRoot; + private final boolean myInModuleSource; + private final boolean myInLibrarySource; + private final boolean myExcluded; + private final byte mySourceRootTypeId; + + DirectoryInfoImpl(Module module, VirtualFile contentRoot, VirtualFile sourceRoot, VirtualFile libraryClassRoot, + boolean inModuleSource, boolean inLibrarySource, boolean isExcluded, int sourceRootTypeId) { + this.module = module; + this.libraryClassRoot = libraryClassRoot; + this.contentRoot = contentRoot; + this.sourceRoot = sourceRoot; + myInModuleSource = inModuleSource; + myInLibrarySource = inLibrarySource; + myExcluded = isExcluded; + if (sourceRootTypeId > MAX_ROOT_TYPE_ID) { + throw new IllegalArgumentException( + "Module source root type id " + sourceRootTypeId + " exceeds the maximum allowable value (" + MAX_ROOT_TYPE_ID + ")"); + } + mySourceRootTypeId = (byte)sourceRootTypeId; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + DirectoryInfoImpl info = (DirectoryInfoImpl)o; + + return mySourceRootTypeId == info.mySourceRootTypeId && + myInModuleSource == info.myInModuleSource && + myInLibrarySource == info.myInLibrarySource && + myExcluded == info.myExcluded && + Comparing.equal(contentRoot, info.contentRoot) && + Comparing.equal(libraryClassRoot, info.libraryClassRoot) && + Comparing.equal(module, info.module) && + Arrays.equals(getOrderEntries(), info.getOrderEntries()) && + Comparing.equal(sourceRoot, info.sourceRoot); + } + + @Override + public int hashCode() { + int result = module != null ? module.hashCode() : 0; + result = 31 * result + (libraryClassRoot != null ? libraryClassRoot.hashCode() : 0); + result = 31 * result + (contentRoot != null ? contentRoot.hashCode() : 0); + result = 31 * result + (sourceRoot != null ? sourceRoot.hashCode() : 0); + result = 31 * result + (myInModuleSource ? 1 : 0); + result = 31 * result + (myInLibrarySource ? 1 : 0); + result = 31 * result + (myExcluded ? 1 : 0); + result = 31 * result + (int)mySourceRootTypeId; + return result; + } + + @SuppressWarnings({"HardCodedStringLiteral"}) + public String toString() { + return "DirectoryInfo{" + + "module=" + getModule() + + ", isInModuleSource=" + isInModuleSource() + + ", rootTypeId=" + getSourceRootTypeId() + + ", isInLibrarySource=" + isInLibrarySource() + + ", isExcludedFromModule=" + isExcluded() + + ", libraryClassRoot=" + getLibraryClassRoot() + + ", contentRoot=" + getContentRoot() + + ", sourceRoot=" + getSourceRoot() + + ", orderEntries=" + Arrays.toString(getOrderEntries()) + + "}"; + } + + @NotNull + private static OrderEntry createFakeOrderEntry(@NotNull final Module ownerModule) { + return new OrderEntry() { + @NotNull + @Override + public VirtualFile[] getFiles(OrderRootType type) { + throw new IncorrectOperationException(); + } + + @NotNull + @Override + public String[] getUrls(OrderRootType rootType) { + throw new IncorrectOperationException(); + } + + @NotNull + @Override + public String getPresentableName() { + throw new IncorrectOperationException(); + } + + @Override + public boolean isValid() { + throw new IncorrectOperationException(); + } + + @NotNull + @Override + public Module getOwnerModule() { + return ownerModule; + } + + @Override + public R accept(RootPolicy policy, @Nullable R initialValue) { + throw new IncorrectOperationException(); + } + + @Override + public int compareTo(@NotNull OrderEntry o) { + throw new IncorrectOperationException(); + } + + @Override + public boolean isSynthetic() { + throw new IncorrectOperationException(); + } + }; + } + + @Nullable + OrderEntry findOrderEntryWithOwnerModule(@NotNull Module ownerModule) { + OrderEntry[] entries = getOrderEntries(); + if (entries.length < 10) { + for (OrderEntry entry : entries) { + if (entry.getOwnerModule() == ownerModule) return entry; + } + return null; + } + int index = Arrays.binarySearch(entries, createFakeOrderEntry(ownerModule), BY_OWNER_MODULE); + return index < 0 ? null : entries[index]; + } + + @NotNull + List findAllOrderEntriesWithOwnerModule(@NotNull Module ownerModule) { + OrderEntry[] entries = getOrderEntries(); + if (entries.length == 1) { + OrderEntry entry = entries[0]; + return entry.getOwnerModule() == ownerModule ? Arrays.asList(entries) : Collections.emptyList(); + } + int index = Arrays.binarySearch(entries, createFakeOrderEntry(ownerModule), BY_OWNER_MODULE); + if (index < 0) { + return Collections.emptyList(); + } + int firstIndex = index; + while (firstIndex-1 >= 0 && entries[firstIndex-1].getOwnerModule() == ownerModule) { + firstIndex--; + } + int lastIndex = index+1; + while (lastIndex < entries.length && entries[lastIndex].getOwnerModule() == ownerModule) { + lastIndex++; + } + + OrderEntry[] subArray = new OrderEntry[lastIndex - firstIndex]; + System.arraycopy(entries, firstIndex, subArray, 0, lastIndex - firstIndex); + + return Arrays.asList(subArray); + } + + public boolean isInProject() { + return !isExcluded(); + } + + public boolean isIgnored() { + return false; + } + + @Nullable + public VirtualFile getSourceRoot() { + return sourceRoot; + } + + public VirtualFile getLibraryClassRoot() { + return libraryClassRoot; + } + + @Nullable + public VirtualFile getContentRoot() { + return contentRoot; + } + + public boolean isInModuleSource() { + return myInModuleSource; + } + + public boolean isInLibrarySource() { + return myInLibrarySource; + } + + public boolean isExcluded() { + return myExcluded; + } + + public Module getModule() { + return module; + } + + @TestOnly + void assertConsistency() { + OrderEntry[] entries = getOrderEntries(); + for (int i=1; i findAllOrderEntriesWithOwnerModule(@NotNull Module ownerModule) { return Collections.emptyList(); } @@ -85,4 +83,45 @@ class NonProjectDirectoryInfo extends DirectoryInfo { public int hashCode() { return System.identityHashCode(this); } + + public boolean isIgnored() { + return false; + } + + @Nullable + public VirtualFile getSourceRoot() { + return null; + } + + public VirtualFile getLibraryClassRoot() { + return null; + } + + @Nullable + public VirtualFile getContentRoot() { + return null; + } + + public boolean isInModuleSource() { + return false; + } + + public boolean isInLibrarySource() { + return false; + } + + public boolean isExcluded() { + return false; + } + + public Module getModule() { + return null; + } + + void assertConsistency() { + } + + public int getSourceRootTypeId() { + return 0; + } } diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java index 5757d78e65cd..ca68cee3d061 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java @@ -224,7 +224,7 @@ public class RootIndex extends DirectoryIndex { } OrderEntry[] array = orderEntries.toArray(new OrderEntry[orderEntries.size()]); - Arrays.sort(array, DirectoryInfo.BY_OWNER_MODULE); + Arrays.sort(array, DirectoryInfoImpl.BY_OWNER_MODULE); return array; } @@ -246,7 +246,7 @@ public class RootIndex extends DirectoryIndex { } int id = myRootTypes.size(); - if (id > DirectoryInfo.MAX_ROOT_TYPE_ID) { + if (id > DirectoryInfoImpl.MAX_ROOT_TYPE_ID) { LOG.error("Too many different types of module source roots (" + id + ") registered: " + myRootTypes); } myRootTypes.add(rootType); @@ -590,8 +590,8 @@ public class RootIndex extends DirectoryIndex { int typeId = moduleSourceRoot != null ? info.rootTypeId.get(moduleSourceRoot) : 0; Module module = parentModuleForExcluded != null ? parentModuleForExcluded : info.contentRootOf.get(moduleContentRoot); - DirectoryInfo directoryInfo = new DirectoryInfo(module, moduleContentRoot, sourceRoot, libraryClassRoot, inModuleSources, inLibrarySource, - parentModuleForExcluded != null, typeId) { + DirectoryInfo directoryInfo = new DirectoryInfoImpl(module, moduleContentRoot, sourceRoot, libraryClassRoot, inModuleSources, inLibrarySource, + parentModuleForExcluded != null, typeId) { @NotNull @Override public OrderEntry[] getOrderEntries() { From 222d8ef5fea593d159af7cb9ffe62ec403e11cc5 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Mon, 21 Jul 2014 14:14:37 +0400 Subject: [PATCH 67/69] bind 'clone caret' actions to ControlDoubleClick+Up/Down --- .../ide/actions/SearchEverywhereAction.java | 88 +------- .../openapi/actionSystem/IdeActions.java | 2 + .../keymap/impl/IdeKeyEventDispatcher.java | 4 +- .../keymap/impl/KeymapManagerImpl.java | 8 +- .../impl/ModifierKeyDoubleClickHandler.java | 210 ++++++++++++++++++ .../ModifierKeyDoubleClickHandlerTest.java | 169 ++++++++++++++ 6 files changed, 395 insertions(+), 86 deletions(-) create mode 100644 platform/platform-impl/src/com/intellij/openapi/keymap/impl/ModifierKeyDoubleClickHandler.java create mode 100644 platform/platform-tests/testSrc/com/intellij/openapi/keymap/impl/ModifierKeyDoubleClickHandlerTest.java diff --git a/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywhereAction.java b/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywhereAction.java index e1d5582204df..ae7ee4363247 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywhereAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywhereAction.java @@ -56,6 +56,7 @@ import com.intellij.openapi.fileEditor.impl.EditorHistoryManager; import com.intellij.openapi.keymap.KeymapManager; import com.intellij.openapi.keymap.KeymapUtil; import com.intellij.openapi.keymap.MacKeymapUtil; +import com.intellij.openapi.keymap.impl.ModifierKeyDoubleClickHandler; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.progress.ProcessCanceledException; @@ -151,106 +152,25 @@ public class SearchEverywhereAction extends AnAction implements CustomComponentA private Component myContextComponent; private CalcThread myCalcThread; private static AtomicBoolean ourShiftIsPressed = new AtomicBoolean(false); - private final static Couple ourPressed = Couple.of(new AtomicBoolean(false), new AtomicBoolean(false)); - private final static Couple ourReleased = Couple.of(new AtomicBoolean(false), new AtomicBoolean(false)); - private static AtomicBoolean ourOtherKeyWasPressed = new AtomicBoolean(false); - private static AtomicLong ourLastTimePressed = new AtomicLong(0); private static AtomicBoolean showAll = new AtomicBoolean(false); private volatile ActionCallback myCurrentWorker = ActionCallback.DONE; private int myHistoryIndex = 0; boolean mySkipFocusGain = false; static { + ModifierKeyDoubleClickHandler.getInstance().registerAction(IdeActions.ACTION_SEARCH_EVERYWHERE, KeyEvent.VK_SHIFT, -1); + IdeEventQueue.getInstance().addPostprocessor(new IdeEventQueue.EventDispatcher() { @Override public boolean dispatch(AWTEvent event) { if (event instanceof KeyEvent) { - final KeyEvent keyEvent = (KeyEvent)event; - final int keyCode = keyEvent.getKeyCode(); - + final int keyCode = ((KeyEvent)event).getKeyCode(); if (keyCode == KeyEvent.VK_SHIFT) { ourShiftIsPressed.set(event.getID() == KeyEvent.KEY_PRESSED); - - if (keyEvent.isControlDown() || keyEvent.isAltDown() || keyEvent.isMetaDown()) { - resetState(); - return false; - } - if (ourOtherKeyWasPressed.get() && System.currentTimeMillis() - ourLastTimePressed.get() < 500) { - resetState(); - return false; - } - ourOtherKeyWasPressed.set(false); - if (ourPressed.first.get() && System.currentTimeMillis() - ourLastTimePressed.get() > 500) { - resetState(); - } - handleShift((KeyEvent)event); - return false; - } else { - ourLastTimePressed.set(System.currentTimeMillis()); - ourOtherKeyWasPressed.set(true); - if (keyCode == KeyEvent.VK_ESCAPE || keyCode == KeyEvent.VK_TAB) { - ourLastTimePressed.set(0); - } } - resetState(); } return false; } - - private void resetState() { - ourPressed.first.set(false); - ourPressed.second.set(false); - ourReleased.first.set(false); - ourReleased.second.set(false); - } - - private void handleShift(KeyEvent event) { - if (ourPressed.first.get() && System.currentTimeMillis() - ourLastTimePressed.get() > 300) { - resetState(); - return; - } - - if (event.getID() == KeyEvent.KEY_PRESSED) { - if (!ourPressed.first.get()) { - resetState(); - ourPressed.first.set(true); - ourLastTimePressed.set(System.currentTimeMillis()); - return; - } else { - if (ourPressed.first.get() && ourReleased.first.get()) { - ourPressed.second.set(true); - ourLastTimePressed.set(System.currentTimeMillis()); - return; - } - } - } else if (event.getID() == KeyEvent.KEY_RELEASED) { - if (ourPressed.first.get() && !ourReleased.first.get()) { - ourReleased.first.set(true); - ourLastTimePressed.set(System.currentTimeMillis()); - return; - } else if (ourPressed.first.get() && ourReleased.first.get() && ourPressed.second.get()) { - resetState(); - run(event); - return; - } - } - resetState(); - } - - private void run(KeyEvent event) { - final ActionManager actionManager = ActionManager.getInstance(); - final AnAction action = actionManager.getAction(IdeActions.ACTION_SEARCH_EVERYWHERE); - if (KeymapManager.getInstance().getActiveKeymap().getShortcuts(IdeActions.ACTION_SEARCH_EVERYWHERE).length > 0) { - return; - } - final AnActionEvent anActionEvent = new AnActionEvent(event, - DataManager.getInstance().getDataContext(IdeFocusManager.findInstance().getFocusOwner()), - ActionPlaces.MAIN_MENU, - action.getTemplatePresentation(), - actionManager, - 0); - action.actionPerformed(anActionEvent); - } }, null); } diff --git a/platform/platform-api/src/com/intellij/openapi/actionSystem/IdeActions.java b/platform/platform-api/src/com/intellij/openapi/actionSystem/IdeActions.java index d4ac053e994e..fddd07785540 100644 --- a/platform/platform-api/src/com/intellij/openapi/actionSystem/IdeActions.java +++ b/platform/platform-api/src/com/intellij/openapi/actionSystem/IdeActions.java @@ -50,6 +50,8 @@ public interface IdeActions { @NonNls String ACTION_EDITOR_COMPLETE_STATEMENT = "EditorCompleteStatement"; @NonNls String ACTION_EDITOR_USE_SOFT_WRAPS = "EditorToggleUseSoftWraps"; @NonNls String ACTION_EDITOR_ADD_OR_REMOVE_CARET= "EditorAddOrRemoveCaret"; + @NonNls String ACTION_EDITOR_CLONE_CARET_BELOW= "EditorCloneCaretBelow"; + @NonNls String ACTION_EDITOR_CLONE_CARET_ABOVE= "EditorCloneCaretAbove"; @NonNls String ACTION_EDITOR_NEXT_TEMPLATE_VARIABLE = "NextTemplateVariable"; @NonNls String ACTION_EDITOR_PREVIOUS_TEMPLATE_VARIABLE = "PreviousTemplateVariable"; diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/IdeKeyEventDispatcher.java b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/IdeKeyEventDispatcher.java index 98498df8ecdc..9a566e9915ef 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/IdeKeyEventDispatcher.java +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/IdeKeyEventDispatcher.java @@ -634,7 +634,9 @@ public final class IdeKeyEventDispatcher implements Disposable { processor.onUpdatePassed(e, action, actionEvent); - ((DataManagerImpl.MyDataContext)myContext.getDataContext()).setEventCount(IdeEventQueue.getInstance().getEventCount(), this); + if (myContext.getDataContext() instanceof DataManagerImpl.MyDataContext) { // this is not true for test data contexts + ((DataManagerImpl.MyDataContext)myContext.getDataContext()).setEventCount(IdeEventQueue.getInstance().getEventCount(), this); + } actionManager.fireBeforeActionPerformed(action, actionEvent.getDataContext(), actionEvent); Component component = PlatformDataKeys.CONTEXT_COMPONENT.getData(actionEvent.getDataContext()); if (component != null && !component.isShowing()) { diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapManagerImpl.java index 4c093211cfd6..122d13fdee9b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -15,6 +15,7 @@ */ package com.intellij.openapi.keymap.impl; +import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.components.*; import com.intellij.openapi.diagnostic.Logger; @@ -35,6 +36,7 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.awt.event.KeyEvent; import java.io.File; import java.io.IOException; import java.util.*; @@ -92,6 +94,10 @@ public class KeymapManagerImpl extends KeymapManagerEx implements PersistentStat } } load(); + + ModifierKeyDoubleClickHandler.getInstance().registerAction(IdeActions.ACTION_EDITOR_CLONE_CARET_ABOVE, KeyEvent.VK_CONTROL, KeyEvent.VK_UP); + ModifierKeyDoubleClickHandler.getInstance().registerAction(IdeActions.ACTION_EDITOR_CLONE_CARET_BELOW, KeyEvent.VK_CONTROL, KeyEvent.VK_DOWN); + ourKeymapManagerInitialized = true; } diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ModifierKeyDoubleClickHandler.java b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ModifierKeyDoubleClickHandler.java new file mode 100644 index 000000000000..2b71711e7538 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ModifierKeyDoubleClickHandler.java @@ -0,0 +1,210 @@ +/* + * Copyright 2000-2014 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.openapi.keymap.impl; + +import com.intellij.ide.DataManager; +import com.intellij.ide.IdeEventQueue; +import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.actionSystem.ActionPlaces; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.keymap.KeymapManager; +import com.intellij.openapi.util.Clock; +import com.intellij.openapi.util.Couple; +import com.intellij.openapi.wm.IdeFocusManager; +import com.intellij.util.containers.ConcurrentHashMap; +import gnu.trove.TIntIntHashMap; +import gnu.trove.TIntIntProcedure; +import org.jetbrains.annotations.NotNull; + +import java.awt.*; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicLong; + +/** + * Support for keyboard shortcuts like Control-double-click or Control-double-click+A + */ +public class ModifierKeyDoubleClickHandler { + private static final ModifierKeyDoubleClickHandler INSTANCE = new ModifierKeyDoubleClickHandler(); + + private final ConcurrentMap myDispatchers = new ConcurrentHashMap(); + + private ModifierKeyDoubleClickHandler() { } + + public static ModifierKeyDoubleClickHandler getInstance() { + return INSTANCE; + } + + /** + * @param actionId Id of action to be triggered on modifier+modifier[+actionKey] + * @param modifierKeyCode keyCode for modifier, e.g. KeyEvent.VK_SHIFT + * @param actionKeyCode keyCode for actionKey, or -1 if action should be triggered on bare modifier double click + */ + public void registerAction(@NotNull String actionId, + int modifierKeyCode, + int actionKeyCode) { + final MyDispatcher dispatcher = new MyDispatcher(actionId, modifierKeyCode, actionKeyCode); + IdeEventQueue.EventDispatcher oldDispatcher = myDispatchers.put(actionId, dispatcher); + IdeEventQueue.getInstance().addDispatcher(dispatcher, null); + if (oldDispatcher != null) { + IdeEventQueue.getInstance().removeDispatcher(oldDispatcher); + } + } + + public void unregisterAction(@NotNull String actionId) { + IdeEventQueue.EventDispatcher oldDispatcher = myDispatchers.remove(actionId); + if (oldDispatcher != null) { + IdeEventQueue.getInstance().removeDispatcher(oldDispatcher); + } + } + + private static class MyDispatcher implements IdeEventQueue.EventDispatcher { + private static final TIntIntHashMap KEY_CODE_TO_MODIFIER_MAP = new TIntIntHashMap(); + static { + KEY_CODE_TO_MODIFIER_MAP.put(KeyEvent.VK_ALT, InputEvent.ALT_MASK); + KEY_CODE_TO_MODIFIER_MAP.put(KeyEvent.VK_CONTROL, InputEvent.CTRL_MASK); + KEY_CODE_TO_MODIFIER_MAP.put(KeyEvent.VK_META, InputEvent.META_MASK); + KEY_CODE_TO_MODIFIER_MAP.put(KeyEvent.VK_SHIFT, InputEvent.SHIFT_MASK); + } + + private final String myActionId; + private final int myModifierKeyCode; + private final int myActionKeyCode; + + private final Couple ourPressed = Couple.of(new AtomicBoolean(false), new AtomicBoolean(false)); + private final Couple ourReleased = Couple.of(new AtomicBoolean(false), new AtomicBoolean(false)); + private final AtomicBoolean ourOtherKeyWasPressed = new AtomicBoolean(false); + private final AtomicLong ourLastTimePressed = new AtomicLong(0); + + public MyDispatcher(@NotNull String actionId, int modifierKeyCode, int actionKeyCode) { + myActionId = actionId; + myModifierKeyCode = modifierKeyCode; + myActionKeyCode = actionKeyCode; + } + + @Override + public boolean dispatch(AWTEvent event) { + if (event instanceof KeyEvent) { + final KeyEvent keyEvent = (KeyEvent)event; + final int keyCode = keyEvent.getKeyCode(); + + if (keyCode == myModifierKeyCode) { + if (hasOtherModifiers(keyEvent)) { + resetState(); + return false; + } + if (ourOtherKeyWasPressed.get() && Clock.getTime() - ourLastTimePressed.get() < 500) { + resetState(); + return false; + } + ourOtherKeyWasPressed.set(false); + if (ourPressed.first.get() && Clock.getTime() - ourLastTimePressed.get() > 500) { + resetState(); + } + handleModifier((KeyEvent)event); + return false; + } else if (ourPressed.first.get() && ourReleased.first.get() && ourPressed.second.get() && myActionKeyCode != -1 && !isActionBound()) { + if (keyCode == myActionKeyCode) { + if (event.getID() == KeyEvent.KEY_RELEASED) { + run(keyEvent); + } + return true; + } + return false; + } else { + ourLastTimePressed.set(Clock.getTime()); + ourOtherKeyWasPressed.set(true); + if (keyCode == KeyEvent.VK_ESCAPE || keyCode == KeyEvent.VK_TAB) { + ourLastTimePressed.set(0); + } + } + resetState(); + } + return false; + } + + private boolean hasOtherModifiers(KeyEvent keyEvent) { + final int modifiers = keyEvent.getModifiers(); + return !KEY_CODE_TO_MODIFIER_MAP.forEachEntry(new TIntIntProcedure() { + @Override + public boolean execute(int keyCode, int modifierMask) { + return keyCode == myModifierKeyCode || (modifiers & modifierMask) == 0; + } + }); + } + + private void handleModifier(KeyEvent event) { + if (ourPressed.first.get() && Clock.getTime() - ourLastTimePressed.get() > 300) { + resetState(); + return; + } + + if (event.getID() == KeyEvent.KEY_PRESSED) { + if (!ourPressed.first.get()) { + resetState(); + ourPressed.first.set(true); + ourLastTimePressed.set(Clock.getTime()); + return; + } else { + if (ourPressed.first.get() && ourReleased.first.get()) { + ourPressed.second.set(true); + ourLastTimePressed.set(Clock.getTime()); + return; + } + } + } else if (event.getID() == KeyEvent.KEY_RELEASED) { + if (ourPressed.first.get() && !ourReleased.first.get()) { + ourReleased.first.set(true); + ourLastTimePressed.set(Clock.getTime()); + return; + } else if (ourPressed.first.get() && ourReleased.first.get() && ourPressed.second.get()) { + resetState(); + if (myActionKeyCode == -1 && !isActionBound()) { + run(event); + } + return; + } + } + resetState(); + } + + private void resetState() { + ourPressed.first.set(false); + ourPressed.second.set(false); + ourReleased.first.set(false); + ourReleased.second.set(false); + } + + private void run(KeyEvent event) { + final ActionManager actionManager = ActionManager.getInstance(); + final AnAction action = actionManager.getAction(myActionId); + final AnActionEvent anActionEvent = new AnActionEvent(event, + DataManager.getInstance().getDataContext(IdeFocusManager.findInstance().getFocusOwner()), + ActionPlaces.MAIN_MENU, + action.getTemplatePresentation(), + actionManager, + 0); + action.actionPerformed(anActionEvent); + } + + private boolean isActionBound() { + return KeymapManager.getInstance().getActiveKeymap().getShortcuts(myActionId).length > 0; + } + } +} diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/keymap/impl/ModifierKeyDoubleClickHandlerTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/keymap/impl/ModifierKeyDoubleClickHandlerTest.java new file mode 100644 index 000000000000..490aa294974d --- /dev/null +++ b/platform/platform-tests/testSrc/com/intellij/openapi/keymap/impl/ModifierKeyDoubleClickHandlerTest.java @@ -0,0 +1,169 @@ +/* + * Copyright 2000-2014 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.openapi.keymap.impl; + +import com.intellij.ide.IdeEventQueue; +import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.KeyboardShortcut; +import com.intellij.openapi.keymap.KeymapManager; +import com.intellij.openapi.util.Clock; +import com.intellij.testFramework.LightPlatformTestCase; + +import javax.swing.*; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; + +public class ModifierKeyDoubleClickHandlerTest extends LightPlatformTestCase { + private static final String MY_SHIFT_SHIFT_ACTION = "ModifierKeyDoubleClickHandlerTest.action1"; + private static final String MY_SHIFT_KEY_ACTION = "ModifierKeyDoubleClickHandlerTest.action2"; + private static final String MY_SHIFT_SHIFT_KEY_ACTION = "ModifierKeyDoubleClickHandlerTest.action3"; + + public static final KeyboardShortcut SHIFT_KEY_SHORTCUT = new KeyboardShortcut(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, + InputEvent.SHIFT_MASK), + null); + + private final JComponent myComponent = new JPanel(); + + private long myCurrentTime; + private int myShiftShiftActionInvocationCount; + private int myShiftKeyActionInvocationCount; + private int myShiftShiftKeyActionInvocationCount; + + @Override + public void setUp() throws Exception { + super.setUp(); + Clock.setTime(0); + ActionManager.getInstance().registerAction(MY_SHIFT_SHIFT_ACTION, new AnAction() { + @Override + public void actionPerformed(AnActionEvent e) { + myShiftShiftActionInvocationCount++; + } + }); + ActionManager.getInstance().registerAction(MY_SHIFT_KEY_ACTION, new AnAction() { + @Override + public void actionPerformed(AnActionEvent e) { + myShiftKeyActionInvocationCount++; + } + }); + ActionManager.getInstance().registerAction(MY_SHIFT_SHIFT_KEY_ACTION, new AnAction() { + @Override + public void actionPerformed(AnActionEvent e) { + myShiftShiftKeyActionInvocationCount++; + } + }); + KeymapManager.getInstance().getActiveKeymap().addShortcut(MY_SHIFT_KEY_ACTION, SHIFT_KEY_SHORTCUT); + ModifierKeyDoubleClickHandler.getInstance().registerAction(MY_SHIFT_SHIFT_ACTION, KeyEvent.VK_SHIFT, -1); + ModifierKeyDoubleClickHandler.getInstance().registerAction(MY_SHIFT_SHIFT_KEY_ACTION, KeyEvent.VK_SHIFT, KeyEvent.VK_BACK_SPACE); + } + + @Override + public void tearDown() throws Exception { + ModifierKeyDoubleClickHandler.getInstance().unregisterAction(MY_SHIFT_SHIFT_KEY_ACTION); + ModifierKeyDoubleClickHandler.getInstance().unregisterAction(MY_SHIFT_SHIFT_ACTION); + KeymapManager.getInstance().getActiveKeymap().removeShortcut(MY_SHIFT_KEY_ACTION, SHIFT_KEY_SHORTCUT); + ActionManager.getInstance().unregisterAction(MY_SHIFT_SHIFT_KEY_ACTION); + ActionManager.getInstance().unregisterAction(MY_SHIFT_KEY_ACTION); + ActionManager.getInstance().unregisterAction(MY_SHIFT_SHIFT_ACTION); + Clock.reset(); + super.tearDown(); + } + + public void testShiftShiftSuccessfulCase() { + press(); + release(); + press(); + assertInvocationCounts(0, 0, 0); + release(); + assertInvocationCounts(0, 1, 0); + } + + public void testLongSecondClick() { + press(); + release(); + press(); + timeStep(400); + release(); + assertInvocationCounts(0, 0, 0); + } + + public void testShiftShiftKeySuccessfulCase() { + press(); + release(); + press(); + key(); + assertInvocationCounts(0, 0, 1); + release(); + assertInvocationCounts(0, 0, 1); + } + + public void testShiftKey() { + press(); + key(); + assertInvocationCounts(1, 0, 0); + release(); + } + + public void assertInvocationCounts(int shiftKeyCount, int shiftShiftCount, int shiftShiftKeyCount) { + assertEquals(shiftKeyCount, myShiftKeyActionInvocationCount); + assertEquals(shiftShiftCount, myShiftShiftActionInvocationCount); + assertEquals(shiftShiftKeyCount, myShiftShiftKeyActionInvocationCount); + } + + private void press() { + IdeEventQueue.getInstance().dispatchEvent(new KeyEvent(myComponent, + KeyEvent.KEY_PRESSED, + Clock.getTime(), + InputEvent.SHIFT_MASK, + KeyEvent.VK_SHIFT, + KeyEvent.CHAR_UNDEFINED)); + } + + private void release() { + IdeEventQueue.getInstance().dispatchEvent(new KeyEvent(myComponent, + KeyEvent.KEY_RELEASED, + Clock.getTime(), + 0, + KeyEvent.VK_SHIFT, + KeyEvent.CHAR_UNDEFINED)); + } + + private void key() { + IdeEventQueue.getInstance().dispatchEvent(new KeyEvent(myComponent, + KeyEvent.KEY_PRESSED, + Clock.getTime(), + InputEvent.SHIFT_MASK, + KeyEvent.VK_BACK_SPACE, + '\b')); + IdeEventQueue.getInstance().dispatchEvent(new KeyEvent(myComponent, + KeyEvent.KEY_TYPED, + Clock.getTime(), + InputEvent.SHIFT_MASK, + 0, + '\b')); + IdeEventQueue.getInstance().dispatchEvent(new KeyEvent(myComponent, + KeyEvent.KEY_RELEASED, + Clock.getTime(), + InputEvent.SHIFT_MASK, + KeyEvent.VK_BACK_SPACE, + '\b')); + } + + private void timeStep(long step) { + Clock.setTime(myCurrentTime += step); + } +} From da026c5443385903cb75ee0f7cdd541a9dcb0f72 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Mon, 21 Jul 2014 14:30:59 +0400 Subject: [PATCH 68/69] override ControlDoubleClick+Left/Right, make new bindings switchable --- .../intellij/openapi/keymap/impl/KeymapManagerImpl.java | 9 +++++++-- .../keymap/impl/ModifierKeyDoubleClickHandler.java | 2 +- .../platform-resources-en/src/misc/registry.properties | 2 ++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapManagerImpl.java index 122d13fdee9b..7b4f5a0371ba 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapManagerImpl.java @@ -28,6 +28,7 @@ import com.intellij.openapi.options.SchemesManager; import com.intellij.openapi.options.SchemesManagerFactory; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.WriteExternalException; +import com.intellij.openapi.util.registry.Registry; import com.intellij.util.containers.ContainerUtil; import org.jdom.Document; import org.jdom.Element; @@ -95,8 +96,12 @@ public class KeymapManagerImpl extends KeymapManagerEx implements PersistentStat } load(); - ModifierKeyDoubleClickHandler.getInstance().registerAction(IdeActions.ACTION_EDITOR_CLONE_CARET_ABOVE, KeyEvent.VK_CONTROL, KeyEvent.VK_UP); - ModifierKeyDoubleClickHandler.getInstance().registerAction(IdeActions.ACTION_EDITOR_CLONE_CARET_BELOW, KeyEvent.VK_CONTROL, KeyEvent.VK_DOWN); + if (Registry.is("editor.add.carets.on.double.control.arrows")) { + ModifierKeyDoubleClickHandler.getInstance().registerAction(IdeActions.ACTION_EDITOR_CLONE_CARET_ABOVE, KeyEvent.VK_CONTROL, KeyEvent.VK_UP); + ModifierKeyDoubleClickHandler.getInstance().registerAction(IdeActions.ACTION_EDITOR_CLONE_CARET_BELOW, KeyEvent.VK_CONTROL, KeyEvent.VK_DOWN); + ModifierKeyDoubleClickHandler.getInstance().registerAction(IdeActions.ACTION_EDITOR_MOVE_CARET_LEFT, KeyEvent.VK_CONTROL, KeyEvent.VK_LEFT); + ModifierKeyDoubleClickHandler.getInstance().registerAction(IdeActions.ACTION_EDITOR_MOVE_CARET_RIGHT, KeyEvent.VK_CONTROL, KeyEvent.VK_RIGHT); + } ourKeymapManagerInitialized = true; } diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ModifierKeyDoubleClickHandler.java b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ModifierKeyDoubleClickHandler.java index 2b71711e7538..28536453b713 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ModifierKeyDoubleClickHandler.java +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ModifierKeyDoubleClickHandler.java @@ -119,7 +119,7 @@ public class ModifierKeyDoubleClickHandler { } handleModifier((KeyEvent)event); return false; - } else if (ourPressed.first.get() && ourReleased.first.get() && ourPressed.second.get() && myActionKeyCode != -1 && !isActionBound()) { + } else if (ourPressed.first.get() && ourReleased.first.get() && ourPressed.second.get() && myActionKeyCode != -1) { if (keyCode == myActionKeyCode) { if (event.getID() == KeyEvent.KEY_RELEASED) { run(keyEvent); diff --git a/platform/platform-resources-en/src/misc/registry.properties b/platform/platform-resources-en/src/misc/registry.properties index ab422ac82cba..0f430e0fee58 100644 --- a/platform/platform-resources-en/src/misc/registry.properties +++ b/platform/platform-resources-en/src/misc/registry.properties @@ -121,6 +121,8 @@ editor.smarterSelectionQuoting=true editor.skip.copy.and.cut.for.empty.selection=false editor.distraction.free.mode=false +editor.add.carets.on.double.control.arrows=true + ide.showIndexRebuildMessage=false ide.tabbedPane.bufferedPaint=true From c3a963a352fc0c7160a3c2ac11d828a8fa17a596 Mon Sep 17 00:00:00 2001 From: Sergey Simonchik Date: Tue, 22 Jul 2014 12:39:42 +0400 Subject: [PATCH 69/69] fix preferred height for JComboBox too --- .../src/com/intellij/openapi/ui/FixedSizeButton.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/ui/FixedSizeButton.java b/platform/platform-api/src/com/intellij/openapi/ui/FixedSizeButton.java index 6f38d9a96356..101444a9d649 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/FixedSizeButton.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/FixedSizeButton.java @@ -87,7 +87,7 @@ public class FixedSizeButton extends JButton { public Dimension getPreferredSize() { if (myComponent != null) { int size = myComponent.getPreferredSize().height; - if (myComponent instanceof ComboBox && (UIUtil.isUnderIntelliJLaF() || UIUtil.isUnderDarcula())) { + if (myComponent instanceof JComboBox && (UIUtil.isUnderIntelliJLaF() || UIUtil.isUnderDarcula())) { size -= 2; // decrement to match JTextField's preferred height } return new Dimension(size, size); @@ -120,9 +120,7 @@ public class FixedSizeButton extends JButton { public void setBounds(Rectangle r) { if (r.width != r.height) { int size = Math.min(r.width, r.height); - r = new Rectangle(r); - r.width = size; - r.height = size; + r = new Rectangle(r.x, r.y, size, size); } super.setBounds(r); }