isInConstructorRef) {
+ if (statement.getReturnValue() != null) {
+ return false;
}
+ final PsiElement methodParent = PsiTreeUtil.getParentOfType(statement, PsiMethod.class, PsiLambdaExpression.class);
+ PsiCodeBlock codeBlock = null;
+ if (methodParent instanceof PsiMethod) {
+ final PsiMethod method = (PsiMethod)methodParent;
+ codeBlock = method.getBody();
+ if (isInConstructorRef != null) {
+ isInConstructorRef.set(method.isConstructor());
+ }
+ }
+ else if (methodParent instanceof PsiLambdaExpression) {
+ isInConstructorRef.set(false);
+ final PsiLambdaExpression lambdaExpression = (PsiLambdaExpression)methodParent;
+ final PsiElement lambdaBody = lambdaExpression.getBody();
+ if (lambdaBody instanceof PsiCodeBlock) {
+ codeBlock = (PsiCodeBlock)lambdaBody;
+ }
+ }
+ else {
+ return false;
+ }
+ if (codeBlock == null) {
+ return false;
+ }
+ if (!ControlFlowUtils.blockCompletesWithStatement(codeBlock, statement)) {
+ return false;
+ }
+ if (ignoreInThenBranch && isInThenBranch(statement)) {
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean isInThenBranch(PsiStatement statement) {
+ final PsiIfStatement ifStatement =
+ PsiTreeUtil.getParentOfType(statement, PsiIfStatement.class, true, PsiMethod.class, PsiLambdaExpression.class);
+ if (ifStatement == null) {
+ return false;
+ }
+ final PsiStatement elseBranch = ifStatement.getElseBranch();
+ return elseBranch != null && !PsiTreeUtil.isAncestor(elseBranch, statement, true);
}
}
\ No newline at end of file
diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/TooBroadScopeInspectionBase.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/TooBroadScopeInspectionBase.java
index 960460d28c93..abaa5582e5ed 100644
--- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/TooBroadScopeInspectionBase.java
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/TooBroadScopeInspectionBase.java
@@ -20,6 +20,8 @@ import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel;
import com.intellij.psi.*;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.tree.IElementType;
+import com.intellij.psi.util.FileTypeUtils;
+import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.Query;
@@ -27,7 +29,6 @@ import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.BaseInspection;
import com.siyeh.ig.BaseInspectionVisitor;
import com.siyeh.ig.psiutils.*;
-import com.intellij.psi.util.FileTypeUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -81,6 +82,15 @@ public class TooBroadScopeInspectionBase extends BaseInspection {
if (PsiUtil.isConstantExpression(expression) || ExpressionUtils.isNullLiteral(expression)) {
return true;
}
+ if (expression instanceof PsiArrayInitializerExpression) {
+ final PsiArrayInitializerExpression arrayInitializerExpression = (PsiArrayInitializerExpression)expression;
+ for (PsiExpression initializer : arrayInitializerExpression.getInitializers()) {
+ if (!isMoveable(initializer)) {
+ return false;
+ }
+ }
+ return true;
+ }
if (expression instanceof PsiNewExpression) {
final PsiNewExpression newExpression = (PsiNewExpression)expression;
final PsiExpression[] arrayDimensions = newExpression.getArrayDimensions();
@@ -93,32 +103,35 @@ public class TooBroadScopeInspectionBase extends BaseInspection {
return true;
}
final PsiArrayInitializerExpression arrayInitializer = newExpression.getArrayInitializer();
- boolean result = true;
if (arrayInitializer != null) {
final PsiExpression[] initializers = arrayInitializer.getInitializers();
for (final PsiExpression initializerExpression : initializers) {
- result &= isMoveable(initializerExpression);
+ if (!isMoveable(initializerExpression)) {
+ return false;
+ }
}
+ return true;
}
final PsiType type = newExpression.getType();
if (type == null) {
return false;
}
else if (!m_allowConstructorAsInitializer) {
- // constructors located in library packages probably have no non-local side effects
- if (!ClassUtils.isImmutable(type) && !LibraryUtil.isTypeInLibrary(type)) {
+ if (!isAllowedType(type)) {
return false;
}
}
final PsiExpressionList argumentList = newExpression.getArgumentList();
if (argumentList == null) {
- return result;
+ return false;
}
final PsiExpression[] expressions = argumentList.getExpressions();
for (final PsiExpression argumentExpression : expressions) {
- result &= isMoveable(argumentExpression);
+ if (!isMoveable(argumentExpression)) {
+ return false;
+ }
}
- return result;
+ return true;
}
if (expression instanceof PsiReferenceExpression) {
final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)expression;
@@ -147,10 +160,12 @@ public class TooBroadScopeInspectionBase extends BaseInspection {
return true;
}
if (expression instanceof PsiMethodCallExpression) {
- // methods located in library packages probably have no non-local side effects
+ if (!isAllowedType(expression.getType())) {
+ return false;
+ }
final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)expression;
final PsiMethod method = methodCallExpression.resolveMethod();
- if (!(method instanceof PsiCompiledElement)) {
+ if (!isAllowedMethod(method)) {
return false;
}
final PsiExpressionList argumentList = methodCallExpression.getArgumentList();
@@ -164,6 +179,43 @@ public class TooBroadScopeInspectionBase extends BaseInspection {
return false;
}
+ private static boolean isAllowedMethod(PsiMethod method) {
+ if (method == null) {
+ return false;
+ }
+ final PsiClass aClass = method.getContainingClass();
+ if (aClass == null) {
+ return false;
+ }
+ final String qualifiedName = aClass.getQualifiedName();
+ if (qualifiedName == null || !qualifiedName.startsWith("java.")) {
+ return false;
+ }
+ final String methodName = method.getName();
+ return !"now".equals(methodName) && !"currentTimeMillis".equals(methodName) && !"nanoTime".equals(methodName);
+ }
+
+ private static boolean isAllowedType(PsiType type) {
+ if (ClassUtils.isImmutable(type)) {
+ return true;
+ }
+ if (!(type instanceof PsiClassType)) {
+ return false;
+ }
+ final PsiClassType classType = (PsiClassType)type;
+ final PsiClass aClass = classType.resolve();
+ return isAllowedClass(aClass);
+ }
+
+ private static boolean isAllowedClass(@Nullable PsiClass aClass) {
+ // allow some "safe" jdk types
+ if (InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_UTIL_COLLECTION) ||
+ InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_UTIL_MAP)) {
+ return true;
+ }
+ return aClass != null && aClass.isEnum();
+ }
+
@Override
public BaseInspectionVisitor buildVisitor() {
return new TooBroadScopeVisitor();
diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/memory/ReplaceEmptyArrayToConstantFix.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/memory/ReplaceEmptyArrayToConstantFix.java
new file mode 100644
index 000000000000..a280e2e5bcb2
--- /dev/null
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/memory/ReplaceEmptyArrayToConstantFix.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2000-2016 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.siyeh.ig.memory;
+
+import com.intellij.codeInspection.ProblemDescriptor;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.*;
+import com.intellij.psi.codeStyle.JavaCodeStyleManager;
+import com.siyeh.InspectionGadgetsBundle;
+import com.siyeh.ig.InspectionGadgetsFix;
+import org.jetbrains.annotations.Nls;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author Konstantin Bulenkov
+ */
+public class ReplaceEmptyArrayToConstantFix extends InspectionGadgetsFix {
+ private final String myText;
+ private final String myName;
+
+ public ReplaceEmptyArrayToConstantFix(PsiClass aClass, PsiField field) {
+ myText = aClass.getQualifiedName() + "." + field.getName();
+ myName = InspectionGadgetsBundle.message("replace.with", aClass.getName() + "." + field.getName());
+ }
+
+ @Nls
+ @NotNull
+ @Override
+ public String getName() {
+ return myName;
+ }
+
+ @Nls
+ @NotNull
+ @Override
+ public String getFamilyName() {
+ return InspectionGadgetsBundle.message("constant.for.zero.length.array.quickfix.family");
+ }
+
+ @Override
+ protected void doFix(Project project, ProblemDescriptor descriptor) {
+ PsiExpression newExp = JavaPsiFacade.getInstance(project).getElementFactory().createExpressionFromText(myText, descriptor.getPsiElement());
+ PsiElement element = descriptor.getPsiElement().replace(newExp);
+ JavaCodeStyleManager.getInstance(project).shortenClassReferences(element);
+ }
+}
diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/memory/UnnecessaryEmptyArrayUsageInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/memory/UnnecessaryEmptyArrayUsageInspection.java
new file mode 100644
index 000000000000..5505aa678b0c
--- /dev/null
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/memory/UnnecessaryEmptyArrayUsageInspection.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2000-2016 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.siyeh.ig.memory;
+
+import com.intellij.psi.*;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.psi.util.PsiTypesUtil;
+import com.siyeh.InspectionGadgetsBundle;
+import com.siyeh.ig.BaseInspection;
+import com.siyeh.ig.BaseInspectionVisitor;
+import com.siyeh.ig.InspectionGadgetsFix;
+import com.siyeh.ig.psiutils.ExpressionUtils;
+import org.jetbrains.annotations.Nls;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author Konstantin Bulenkov
+ */
+public class UnnecessaryEmptyArrayUsageInspection extends BaseInspection {
+ @Nls
+ @NotNull
+ @Override
+ public String getDisplayName() {
+ return InspectionGadgetsBundle.message("constant.for.zero.length.array.display.name");
+ }
+
+ @NotNull
+ @Override
+ protected String buildErrorString(Object... infos) {
+ return InspectionGadgetsBundle.message("constant.for.zero.length.array.problem.descriptor");
+ }
+
+ @Nullable
+ @Override
+ protected InspectionGadgetsFix buildFix(Object... infos) {
+ return new ReplaceEmptyArrayToConstantFix((PsiClass)infos[0], (PsiField)infos[1]);
+ }
+
+ @Override
+ public BaseInspectionVisitor buildVisitor() {
+ return new BaseInspectionVisitor() {
+ @Override
+ public void visitNewExpression(PsiNewExpression expression) {
+ if (ExpressionUtils.isZeroLengthArrayConstruction(expression)) {
+ PsiType type = expression.getType();
+ if (type instanceof PsiArrayType) {
+ PsiType arrayType = ((PsiArrayType)type).getComponentType();
+ PsiClass typeClass = PsiTypesUtil.getPsiClass(arrayType);
+ if (typeClass != null) {
+ for (PsiField field : typeClass.getFields()) {
+ PsiModifierList modifiers = field.getModifierList();
+ if (modifiers != null
+ && !typeClass.isEquivalentTo(PsiTreeUtil.findFirstParent(expression, (e) -> e instanceof PsiClass))
+ && modifiers.hasModifierProperty(PsiModifier.FINAL)
+ && modifiers.hasModifierProperty(PsiModifier.PUBLIC)
+ && ExpressionUtils.isZeroLengthArrayConstruction(field.getInitializer())) {
+ registerError(expression, typeClass, field);
+ return;
+ }
+ }
+ }
+ }
+ }
+ super.visitNewExpression(expression);
+ }
+ };
+ }
+}
diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ClassUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ClassUtils.java
index 0ded3aae25b1..a361fd33eb93 100644
--- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ClassUtils.java
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ClassUtils.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2014 Dave Griffith, Bas Leijdekkers
+ * Copyright 2003-2016 Dave Griffith, Bas Leijdekkers
*
* 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.siyeh.ig.psiutils;
+import com.intellij.codeInspection.concurrencyAnnotations.JCiPUtil;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.TypeConversionUtil;
@@ -68,14 +69,22 @@ public class ClassUtils {
immutableTypes.add(CommonClassNames.JAVA_LANG_BYTE);
immutableTypes.add(CommonClassNames.JAVA_LANG_STRING);
immutableTypes.add("java.awt.Font");
+ immutableTypes.add("java.awt.BasicStroke");
immutableTypes.add("java.awt.Color");
+ immutableTypes.add("java.awt.Cursor");
immutableTypes.add("java.math.BigDecimal");
immutableTypes.add("java.math.BigInteger");
immutableTypes.add("java.math.MathContext");
immutableTypes.add("java.nio.channels.FileLock");
immutableTypes.add("java.nio.charset.Charset");
immutableTypes.add("java.io.File");
+ immutableTypes.add("java.net.Inet4Address");
+ immutableTypes.add("java.net.Inet6Address");
+ immutableTypes.add("java.net.InetSocketAddress");
immutableTypes.add("java.net.URI");
+ immutableTypes.add("java.net.URL");
+ immutableTypes.add("java.util.Locale");
+ immutableTypes.add("java.util.UUID");
immutableTypes.add("java.util.regex.Pattern");
}
@@ -107,8 +116,14 @@ public class ClassUtils {
return false;
}
final PsiClassType classType = (PsiClassType)type;
- final String className = classType.getCanonicalText();
- return immutableTypes.contains(className);
+ final PsiClass aClass = classType.resolve();
+ if (aClass == null) {
+ return false;
+ }
+ if (immutableTypes.contains(aClass.getQualifiedName())) {
+ return true;
+ }
+ return JCiPUtil.isImmutable(aClass);
}
public static boolean inSamePackage(@Nullable PsiElement element1,
diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/visibility/LambdaParameterHidingMemberVariableInspectionBase.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/visibility/LambdaParameterHidingMemberVariableInspectionBase.java
index e170a817fb82..c1b94759e129 100644
--- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/visibility/LambdaParameterHidingMemberVariableInspectionBase.java
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/visibility/LambdaParameterHidingMemberVariableInspectionBase.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2014 Dave Griffith, Bas Leijdekkers
+ * Copyright 2003-2016 Dave Griffith, Bas Leijdekkers
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -59,7 +59,7 @@ public class LambdaParameterHidingMemberVariableInspectionBase extends BaseInspe
@Override
public JComponent createOptionsPanel() {
final MultipleCheckboxOptionsPanel optionsPanel = new MultipleCheckboxOptionsPanel(this);
- optionsPanel.addCheckbox(InspectionGadgetsBundle.message("parameter.hides.member.variable.ignore.superclass.option"),
+ optionsPanel.addCheckbox(InspectionGadgetsBundle.message("lambda.parameter.hides.member.variable.ignore.invisible.option"),
"m_ignoreInvisibleFields");
return optionsPanel;
}
@@ -98,13 +98,13 @@ public class LambdaParameterHidingMemberVariableInspectionBase extends BaseInspe
}
PsiClass aClass = ClassUtils.getContainingClass(variable);
while (aClass != null) {
- final PsiField[] fields = aClass.getAllFields();
- for (PsiField field : fields) {
- final String fieldName = field.getName();
- if (!variableName.equals(fieldName)) {
- continue;
+ final PsiField field = aClass.findFieldByName(variableName, true);
+ if (field != null) {
+ if (!m_ignoreInvisibleFields){
+ return aClass;
}
- if (!m_ignoreInvisibleFields || ClassUtils.isFieldVisible(field, aClass)) {
+ else if (ClassUtils.isFieldVisible(field, aClass) &&
+ (PsiUtil.getEnclosingStaticElement(variable, aClass) == null) || field.hasModifierProperty(PsiModifier.STATIC)){
return aClass;
}
}
diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/LambdaParameterHidingMemberVariable.html b/plugins/InspectionGadgets/src/inspectionDescriptions/LambdaParameterHidingMemberVariable.html
index 3c06751478b0..4e2fdc1a161b 100644
--- a/plugins/InspectionGadgets/src/inspectionDescriptions/LambdaParameterHidingMemberVariable.html
+++ b/plugins/InspectionGadgets/src/inspectionDescriptions/LambdaParameterHidingMemberVariable.html
@@ -1,10 +1,10 @@
-Reports lambda parameters named identically to visible fields of the surrounding classes
-and their superclasses.
+Reports lambda parameters named identically to fields of the surrounding classes or their superclasses.
-Use the checkbox below to ignore fields that are not actually visible from the lambda expression, for example private fields
+Use the checkbox below to ignore fields that are not actually visible from the lambda expression.
+For example private fields in a super class.
\ No newline at end of file
diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/UnnecessaryEmptyArrayUsage.html b/plugins/InspectionGadgets/src/inspectionDescriptions/UnnecessaryEmptyArrayUsage.html
new file mode 100644
index 000000000000..c1745110e071
--- /dev/null
+++ b/plugins/InspectionGadgets/src/inspectionDescriptions/UnnecessaryEmptyArrayUsage.html
@@ -0,0 +1,8 @@
+
+
+Reports on allocations of arrays with known lengths of zero when there is a constant for that in the class of array's type.
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/CovariantEqualsInspection.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/CovariantEqualsInspection.java
deleted file mode 100644
index e0ea3d2009f0..000000000000
--- a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/CovariantEqualsInspection.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.siyeh.igtest.bugs;
-
-public class CovariantEqualsInspection
-{
- public CovariantEqualsInspection()
- {
- }
-
- public boolean equals(CovariantEqualsInspection foo)
- {
- return true;
- }
-}
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/CovariantEqualsInspection2.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/CovariantEqualsInspection2.java
deleted file mode 100644
index 526f7e7887ac..000000000000
--- a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/CovariantEqualsInspection2.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.siyeh.igtest.bugs;
-
-public class CovariantEqualsInspection2
-{
- public CovariantEqualsInspection2()
- {
- }
-
- public boolean equals(CovariantEqualsInspection2 foo)
- {
- return true;
- }
-
- public boolean equals(Object foo)
- {
- return true;
- }
-}
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/covariant_equals/CovariantEquals.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/covariant_equals/CovariantEquals.java
index e34f07954ea3..8c53ae024b66 100644
--- a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/covariant_equals/CovariantEquals.java
+++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/covariant_equals/CovariantEquals.java
@@ -28,4 +28,9 @@ class D implements I {
public boolean equals(I i) {
return false;
}
+}
+class E {
+ boolean equals(E e) {
+ return false;
+ }
}
\ No newline at end of file
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/dataflow/scope/TooBroadScope.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/dataflow/scope/TooBroadScope.java
index 44ffdf41a6e5..6b45d6f66368 100644
--- a/plugins/InspectionGadgets/test/com/siyeh/igtest/dataflow/scope/TooBroadScope.java
+++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/dataflow/scope/TooBroadScope.java
@@ -150,6 +150,7 @@ public class TooBroadScope
}
private final String[] EMPTY = {};
+ private final String[] ONE = {"one"};
void abc() {
String[] strings = EMPTY;
System.out.println();
@@ -160,5 +161,41 @@ public class TooBroadScope
System.out.println();
System.out.println();
System.out.println(list);
+
+ String[] ss = new String[10];
+ System.out.println();
+ System.out.println();
+ System.out.println(ss);
+
+ String[] ss2 = new String[] {""};
+ System.out.println();
+ System.out.println();
+ System.out.println(ss2);
+
+ String[] ss3 = {};
+ System.out.println();
+ System.out.println();
+ System.out.println(ss3);
+
+ String[] ss3a = {ONE[0]};
+ backgroundAction();
+ System.out.println();
+ System.out.println(ss3a);
+
+ List ss4 = Arrays.asList(ONE);
+ backgroundAction();
+ System.out.println();
+ System.out.println(ss4);
+ }
+
+ void backgroundAction() {
+ ONE[0] = "two";
+ }
+
+ void time() {
+ long start = System.currentTimeMillis();
+ System.out.println();
+ long end = System.currentTimeMillis();
+ System.out.println("elapsed: " + (end - start));
}
}
\ No newline at end of file
diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/visibility/LambdaParameterHidingMemberVariableInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/visibility/LambdaParameterHidingMemberVariableInspectionTest.java
index e7c3b75f1a6d..1f6a804a3bde 100644
--- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/visibility/LambdaParameterHidingMemberVariableInspectionTest.java
+++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/visibility/LambdaParameterHidingMemberVariableInspectionTest.java
@@ -45,4 +45,24 @@ public class LambdaParameterHidingMemberVariableInspectionTest extends LightInsp
" }" +
"}");
}
+
+ public void testStatic() {
+ doTest("import java.util.function.Function;" +
+ "class X {" +
+ " private String s;" +
+ " static Function m() {" +
+ " return s -> null; " +
+ " }" +
+ "}");
+ }
+
+ public void testStaticStatic() {
+ doTest("import java.util.function.Function;" +
+ "class X {" +
+ " private static String s;" +
+ " static Function m() {" +
+ " return /*Lambda parameter 's' hides field in class 'X'*/s/**/ -> null; " +
+ " }" +
+ "}");
+ }
}
diff --git a/plugins/IntelliLang/IntelliLang-java.iml b/plugins/IntelliLang/IntelliLang-java.iml
index 585a1f6d5a17..66a00fa603db 100644
--- a/plugins/IntelliLang/IntelliLang-java.iml
+++ b/plugins/IntelliLang/IntelliLang-java.iml
@@ -11,7 +11,7 @@
-
+
@@ -22,5 +22,4 @@
-
-
+
\ No newline at end of file
diff --git a/plugins/IntelliLang/IntelliLang-xml.iml b/plugins/IntelliLang/IntelliLang-xml.iml
index 20db7d65ff08..1659417efc9d 100644
--- a/plugins/IntelliLang/IntelliLang-xml.iml
+++ b/plugins/IntelliLang/IntelliLang-xml.iml
@@ -10,7 +10,7 @@
-
+
@@ -22,5 +22,4 @@
-
-
+
\ No newline at end of file
diff --git a/plugins/ant/src/com/intellij/lang/ant/config/impl/AntConfigurationImpl.java b/plugins/ant/src/com/intellij/lang/ant/config/impl/AntConfigurationImpl.java
index 59b051bf2807..bbb29dc539a3 100644
--- a/plugins/ant/src/com/intellij/lang/ant/config/impl/AntConfigurationImpl.java
+++ b/plugins/ant/src/com/intellij/lang/ant/config/impl/AntConfigurationImpl.java
@@ -53,7 +53,6 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.xml.XmlFile;
-import com.intellij.util.ActionRunner;
import com.intellij.util.EventDispatcher;
import com.intellij.util.StringSetSpinAllocator;
import com.intellij.util.concurrency.Semaphore;
@@ -89,7 +88,7 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis
@Nullable
public String get(final AbstractPropertyContainer container) {
if (!container.hasProperty(this)) return null;
- AntConfiguration antConfiguration = AntConfigurationImpl.INSTANCE.get(container);
+ AntConfiguration antConfiguration = INSTANCE.get(container);
return ProjectRootManager.getInstance(antConfiguration.getProject()).getProjectSdkName();
}
@@ -145,7 +144,7 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis
daemon.restart();
}
else {
- SwingUtilities.invokeLater(() -> daemon.restart());
+ SwingUtilities.invokeLater(daemon::restart);
}
}
});
@@ -172,19 +171,42 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis
public Element getState() {
try {
- final Element e = new Element("state");
- writeExternal(e);
- return e;
+ final Element state = new Element("state");
+ getProperties().writeExternal(state);
+ ApplicationManager.getApplication().runReadAction(() -> {
+ for (final AntBuildFileBase buildFile : getBuildFiles()) {
+ final Element element = new Element(BUILD_FILE);
+ element.setAttribute(URL, buildFile.getVirtualFile().getUrl());
+ buildFile.writeProperties(element);
+ saveEvents(element, buildFile);
+ state.addContent(element);
+ }
+
+ final List files = new ArrayList(myAntFileToContextFileMap.keySet());
+ // sort in order to minimize changes
+ Collections.sort(files, (o1, o2) -> o1.getUrl().compareTo(o2.getUrl()));
+ for (VirtualFile file : files) {
+ final Element element = new Element(CONTEXT_MAPPING);
+ final VirtualFile contextFile = myAntFileToContextFileMap.get(file);
+ element.setAttribute(URL, file.getUrl());
+ element.setAttribute(CONTEXT, contextFile.getUrl());
+ state.addContent(element);
+ }
+ });
+ return state;
}
- catch (WriteExternalException e1) {
- LOG.error(e1);
+ catch (WriteExternalException e) {
+ LOG.error(e);
return null;
}
}
public void loadState(Element state) {
try {
- readExternal(state);
+ myIsInitialized = Boolean.FALSE;
+ myAntWorkspaceConfiguration.loadFromProjectSettings(state);
+ getProperties().readExternal(state);
+ runWhenInitialized(() -> loadBuildFileProjectProperties(state));
}
catch (InvalidDataException e) {
LOG.error(e);
@@ -348,17 +370,6 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis
}
}
- public void handleTargetRename(String oldTargetName, String newTargetName) {
- synchronized (myEventToTargetMap) {
- for (Map.Entry> entry : myEventToTargetMap.entrySet()) {
- final Pair pair = entry.getValue();
- if (pair != null && Comparing.equal(pair.getSecond(), oldTargetName)) {
- entry.setValue(Pair.create(pair.getFirst(), newTargetName));
- }
- }
- }
- }
-
public void updateBuildFile(final AntBuildFile buildFile) {
incModificationCount();
myEventDispatcher.getMulticaster().buildFileChanged(buildFile);
@@ -387,57 +398,12 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis
return getModel(buildFile);
}
- private void readExternal(final Element parentNode) throws InvalidDataException {
- myIsInitialized = Boolean.FALSE;
- myAntWorkspaceConfiguration.loadFromProjectSettings(parentNode);
- getProperties().readExternal(parentNode);
- runWhenInitialized(() -> loadBuildFileProjectProperties(parentNode));
- }
-
private void runWhenInitialized(final Runnable runnable) {
if (getProject().isInitialized()) {
- ApplicationManager.getApplication().runReadAction(() -> runnable.run());
+ ApplicationManager.getApplication().runReadAction(runnable);
}
else {
- myStartupManager.runWhenProjectIsInitialized(() -> runnable.run());
- }
- }
-
- private void writeExternal(final Element parentNode) throws WriteExternalException {
- getProperties().writeExternal(parentNode);
- try {
- ActionRunner.runInsideReadAction(new ActionRunner.InterruptibleRunnable() {
- public void run() throws WriteExternalException {
- for (final AntBuildFileBase buildFile : getBuildFiles()) {
- final Element element = new Element(BUILD_FILE);
- element.setAttribute(URL, buildFile.getVirtualFile().getUrl());
- buildFile.writeProperties(element);
- saveEvents(element, buildFile);
- parentNode.addContent(element);
- }
- final List files = new ArrayList(myAntFileToContextFileMap.keySet());
- // sort in order to minimize changes
- Collections.sort(files, (o1, o2) -> o1.getUrl().compareTo(o2.getUrl()));
- for (VirtualFile file : files) {
- final Element element = new Element(CONTEXT_MAPPING);
- final VirtualFile contextFile = myAntFileToContextFileMap.get(file);
- element.setAttribute(URL, file.getUrl());
- element.setAttribute(CONTEXT, contextFile.getUrl());
- parentNode.addContent(element);
- }
- }
- });
- }
- catch (WriteExternalException e) {
- LOG.error(e);
- throw e;
- }
- catch (RuntimeException e) {
- LOG.error(e);
- throw e;
- }
- catch (Exception e) {
- LOG.error(e);
+ myStartupManager.runWhenProjectIsInitialized(runnable);
}
}
@@ -607,7 +573,7 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis
}
public static boolean executeTargetSynchronously(final DataContext dataContext, final AntBuildTarget target) {
- return executeTargetSynchronously(dataContext, target, Collections.emptyList());
+ return executeTargetSynchronously(dataContext, target, Collections.emptyList());
}
public static boolean executeTargetSynchronously(final DataContext dataContext, final AntBuildTarget target, final List additionalProperties) {
@@ -658,8 +624,7 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis
private void loadBuildFileProjectProperties(final Element parentNode) {
final List> files = new ArrayList>();
final VirtualFileManager vfManager = VirtualFileManager.getInstance();
- for (final Object o : parentNode.getChildren(BUILD_FILE)) {
- final Element element = (Element)o;
+ for (final Element element : parentNode.getChildren(BUILD_FILE)) {
final String url = element.getAttributeValue(URL);
if (url != null) {
files.add(Pair.create(element, url));
@@ -668,8 +633,7 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis
// contexts
myAntFileToContextFileMap.clear();
- for (final Object o : parentNode.getChildren(CONTEXT_MAPPING)) {
- final Element element = (Element)o;
+ for (final Element element : parentNode.getChildren(CONTEXT_MAPPING)) {
final String url = element.getAttributeValue(URL);
final String contextUrl = element.getAttributeValue(CONTEXT);
final VirtualFile file = vfManager.findFileByUrl(url);
@@ -831,7 +795,7 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis
if (!app.isDispatchThread() || task.isHeadless()) {
// for headless tasks we need to ensure async execution.
// Otherwise calls to AntConfiguration.getInstance() from the task will cause SOE
- app.invokeLater(() -> task.queue(), ModalityState.any());
+ app.invokeLater(task::queue, ModalityState.any());
}
else {
task.queue();
diff --git a/plugins/ant/src/com/intellij/lang/ant/config/impl/AntWorkspaceConfiguration.java b/plugins/ant/src/com/intellij/lang/ant/config/impl/AntWorkspaceConfiguration.java
index a48956d803e0..af38da22f48b 100644
--- a/plugins/ant/src/com/intellij/lang/ant/config/impl/AntWorkspaceConfiguration.java
+++ b/plugins/ant/src/com/intellij/lang/ant/config/impl/AntWorkspaceConfiguration.java
@@ -29,12 +29,12 @@ import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
-import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
@State(name = "antWorkspaceConfiguration", storages = @Storage(StoragePathMacros.WORKSPACE_FILE))
public class AntWorkspaceConfiguration implements PersistentStateComponent {
private static final Logger LOG = Logger.getInstance("#com.intellij.lang.ant.config.impl.AntWorkspaceConfiguration");
+
private final Project myProject;
@NonNls private static final String BUILD_FILE = "buildFile";
@NonNls private static final String URL = "url";
@@ -68,9 +68,6 @@ public class AntWorkspaceConfiguration implements PersistentStateComponent
-
+
diff --git a/plugins/editorconfig/src/org/editorconfig/Utils.java b/plugins/editorconfig/src/org/editorconfig/Utils.java
index ada5beb69761..ed7886bc9e38 100644
--- a/plugins/editorconfig/src/org/editorconfig/Utils.java
+++ b/plugins/editorconfig/src/org/editorconfig/Utils.java
@@ -1,13 +1,37 @@
package org.editorconfig;
+import com.intellij.codeStyle.CodeStyleFacade;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.editor.ex.EditorSettingsExternalizable;
+import com.intellij.openapi.fileTypes.FileNameMatcher;
+import com.intellij.openapi.fileTypes.FileType;
+import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.ui.Messages;
+import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.openapi.vfs.encoding.EncodingProjectManager;
import com.intellij.psi.codeStyle.CodeStyleSettings;
+import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
+import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
+import com.intellij.psi.search.FileTypeIndex;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.util.LineSeparator;
+import org.editorconfig.configmanagement.EditorConfigIndentOptionsProvider;
+import org.editorconfig.configmanagement.EditorSettingsManager;
+import org.editorconfig.configmanagement.EncodingManager;
+import org.editorconfig.configmanagement.LineEndingsManager;
import org.editorconfig.core.EditorConfig.OutPair;
import org.editorconfig.plugincomponents.EditorConfigNotifier;
import org.editorconfig.settings.EditorConfigSettings;
+import org.jetbrains.annotations.NotNull;
+import java.io.IOException;
+import java.nio.charset.Charset;
import java.util.List;
+import java.util.Locale;
+import java.util.Map;
public class Utils {
public static String configValueForKey(List outPairs, String key) {
@@ -37,4 +61,108 @@ public class Utils {
}
return file.getCanonicalPath();
}
+
+ public static void export(Project project) {
+ final CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(project);
+ final CommonCodeStyleSettings.IndentOptions commonIndentOptions = settings.getIndentOptions();
+ StringBuilder result = new StringBuilder();
+ addIndentOptions(result, "*", commonIndentOptions, getEncoding(project) +
+ getLineEndings(project) +
+ getTrailingSpaces() +
+ getEndOfFile());
+ for (FileType fileType : FileTypeManager.getInstance().getRegisteredFileTypes()) {
+ if (!FileTypeIndex.containsFileOfType(fileType, GlobalSearchScope.allScope(project))) continue;
+
+ final CommonCodeStyleSettings.IndentOptions options = settings.getIndentOptions(fileType);
+ if (!equalIndents(commonIndentOptions, options)) {
+ addIndentOptions(result, buildPattern(fileType), options, "");
+ }
+ }
+ final VirtualFile baseDir = project.getBaseDir();
+ final VirtualFile child = baseDir.findChild(".editorconfig");
+ if (child != null) {
+ final String message = ".editorconfig already present in " + baseDir.getPath() + "\nOverwrite?";
+ if (Messages.showYesNoDialog(project, message, ".editorconfig exists", null) == Messages.NO) return;
+ }
+ ApplicationManager.getApplication().runWriteAction(() -> {
+ try {
+ final VirtualFile editorConfig = baseDir.findOrCreateChildData(Utils.class, ".editorconfig");
+ VfsUtil.saveText(editorConfig, result.toString());
+ } catch (IOException e) {
+ Logger.getInstance(Utils.class).error(e);
+ }
+ });
+ }
+
+ private static String getEndOfFile() {
+ return EditorSettingsManager.insertFinalNewlineKey + "=" + EditorSettingsExternalizable.getInstance().isEnsureNewLineAtEOF() + "\n";
+ }
+
+ private static String getTrailingSpaces() {
+ final String spaces = EditorSettingsExternalizable.getInstance().getStripTrailingSpaces();
+ if (EditorSettingsExternalizable.STRIP_TRAILING_SPACES_NONE.equals(spaces)) return EditorSettingsManager.trimTrailingWhitespaceKey + "=false\n";
+ if (EditorSettingsExternalizable.STRIP_TRAILING_SPACES_WHOLE.equals(spaces)) return EditorSettingsManager.trimTrailingWhitespaceKey + "=true\n";
+ return "";
+ }
+
+ private static String getLineEndings(Project project) {
+ final String separator = CodeStyleFacade.getInstance(project).getLineSeparator();
+ for (LineSeparator s : LineSeparator.values()) {
+ if (separator.equals(s.getSeparatorString())) {
+ return LineEndingsManager.lineEndingsKey + "=" + s.name().toLowerCase(Locale.US) + "\n";
+ }
+ }
+ return "";
+ }
+
+ @NotNull
+ private static String getEncoding(Project project) {
+ final Charset charset = EncodingProjectManager.getInstance(project).getDefaultCharset();
+ for (Map.Entry entry : EncodingManager.encodingMap.entrySet()) {
+ if (entry.getValue() == charset) {
+ return EncodingManager.charsetKey + "=" + entry.getKey() + "\n";
+ }
+ }
+ return "";
+ }
+
+ @NotNull
+ private static String buildPattern(FileType fileType) {
+ final StringBuilder result = new StringBuilder();
+ final List associations = FileTypeManager.getInstance().getAssociations(fileType);
+ for (FileNameMatcher matcher : associations) {
+ if (result.length() != 0) result.append(",");
+ result.append(matcher.getPresentableString());
+ }
+ if (associations.size() > 1) {
+ result.insert(0, "{").append("}");
+ }
+ return result.toString();
+ }
+
+ private static boolean equalIndents(CommonCodeStyleSettings.IndentOptions commonIndentOptions,
+ CommonCodeStyleSettings.IndentOptions options) {
+ return options.USE_TAB_CHARACTER == commonIndentOptions.USE_TAB_CHARACTER &&
+ options.TAB_SIZE == commonIndentOptions.TAB_SIZE &&
+ options.INDENT_SIZE == commonIndentOptions.INDENT_SIZE;
+ }
+
+ private static void addIndentOptions(StringBuilder result,
+ String pattern,
+ CommonCodeStyleSettings.IndentOptions options,
+ String additionalText) {
+ if (pattern.isEmpty()) return;
+
+ result.append("[").append(pattern).append("]").append("\n");
+ result.append(additionalText);
+ result.append(EditorConfigIndentOptionsProvider.indentStyleKey).append("=");
+ if (options.USE_TAB_CHARACTER) {
+ result.append("tab\n");
+ result.append(EditorConfigIndentOptionsProvider.tabWidthKey).append("=").append(options.TAB_SIZE).append("\n");
+ } else {
+ result.append("space\n");
+ result.append(EditorConfigIndentOptionsProvider.indentSizeKey).append("=").append(options.INDENT_SIZE).append("\n");
+ }
+ result.append("\n");
+ }
}
diff --git a/plugins/editorconfig/src/org/editorconfig/configmanagement/EditorConfigIndentOptionsProvider.java b/plugins/editorconfig/src/org/editorconfig/configmanagement/EditorConfigIndentOptionsProvider.java
index a94063aca717..5bcfa4f7fbab 100644
--- a/plugins/editorconfig/src/org/editorconfig/configmanagement/EditorConfigIndentOptionsProvider.java
+++ b/plugins/editorconfig/src/org/editorconfig/configmanagement/EditorConfigIndentOptionsProvider.java
@@ -19,10 +19,10 @@ import java.util.List;
*/
public class EditorConfigIndentOptionsProvider extends FileIndentOptionsProvider {
// Handles the following EditorConfig settings:
- private static final String indentSizeKey = "indent_size";
- private static final String continuationSizeKey = "continuation_indent_size";
- private static final String tabWidthKey = "tab_width";
- private static final String indentStyleKey = "indent_style";
+ public static final String indentSizeKey = "indent_size";
+ public static final String continuationSizeKey = "continuation_indent_size";
+ public static final String tabWidthKey = "tab_width";
+ public static final String indentStyleKey = "indent_style";
@Nullable
@Override
diff --git a/plugins/editorconfig/src/org/editorconfig/configmanagement/EditorSettingsManager.java b/plugins/editorconfig/src/org/editorconfig/configmanagement/EditorSettingsManager.java
index 8e3f7db77a60..4bcfb24123d0 100644
--- a/plugins/editorconfig/src/org/editorconfig/configmanagement/EditorSettingsManager.java
+++ b/plugins/editorconfig/src/org/editorconfig/configmanagement/EditorSettingsManager.java
@@ -21,8 +21,8 @@ import java.util.Map;
public class EditorSettingsManager extends FileDocumentManagerAdapter {
// Handles the following EditorConfig settings:
- private static final String trimTrailingWhitespaceKey = "trim_trailing_whitespace";
- private static final String insertFinalNewlineKey = "insert_final_newline";
+ public static final String trimTrailingWhitespaceKey = "trim_trailing_whitespace";
+ public static final String insertFinalNewlineKey = "insert_final_newline";
private static final Map trimMap;
static {
diff --git a/plugins/editorconfig/src/org/editorconfig/configmanagement/EncodingManager.java b/plugins/editorconfig/src/org/editorconfig/configmanagement/EncodingManager.java
index 3aec6497f144..abcaf7510cab 100644
--- a/plugins/editorconfig/src/org/editorconfig/configmanagement/EncodingManager.java
+++ b/plugins/editorconfig/src/org/editorconfig/configmanagement/EncodingManager.java
@@ -22,11 +22,11 @@ import java.util.Map;
public class EncodingManager extends FileDocumentManagerAdapter {
// Handles the following EditorConfig settings:
- private static final String charsetKey = "charset";
+ public static final String charsetKey = "charset";
private final Project myProject;
- private static final Map encodingMap;
+ public static final Map encodingMap;
static {
Map map = new HashMap();
diff --git a/plugins/editorconfig/src/org/editorconfig/configmanagement/LineEndingsManager.java b/plugins/editorconfig/src/org/editorconfig/configmanagement/LineEndingsManager.java
index eb2cfea56b6a..f860bd841f75 100644
--- a/plugins/editorconfig/src/org/editorconfig/configmanagement/LineEndingsManager.java
+++ b/plugins/editorconfig/src/org/editorconfig/configmanagement/LineEndingsManager.java
@@ -29,7 +29,7 @@ import java.util.Locale;
*/
public class LineEndingsManager extends FileDocumentManagerAdapter {
// Handles the following EditorConfig settings:
- private static final String lineEndingsKey = "end_of_line";
+ public static final String lineEndingsKey = "end_of_line";
private final Project myProject;
private boolean statusBarUpdated = false;
diff --git a/plugins/editorconfig/src/org/editorconfig/settings/EditorConfigConfigurable.java b/plugins/editorconfig/src/org/editorconfig/settings/EditorConfigConfigurable.java
index 15678c6d322f..64b03df40714 100644
--- a/plugins/editorconfig/src/org/editorconfig/settings/EditorConfigConfigurable.java
+++ b/plugins/editorconfig/src/org/editorconfig/settings/EditorConfigConfigurable.java
@@ -4,16 +4,19 @@ import com.intellij.application.options.GeneralCodeStyleOptionsProvider;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.ui.VerticalFlowLayout;
+import com.intellij.openapi.wm.IdeFrame;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.codeStyle.CodeStyleSettingsProvider;
import com.intellij.psi.codeStyle.CustomCodeStyleSettings;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.ui.components.JBCheckBox;
import com.intellij.util.ui.UIUtil;
+import org.editorconfig.Utils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
+import java.awt.*;
/**
* @author Dennis.Ushakov
@@ -25,14 +28,27 @@ public class EditorConfigConfigurable extends CodeStyleSettingsProvider implemen
@Override
public JComponent createComponent() {
myEnabled = new JBCheckBox("Enable EditorConfig support");
+ final JPanel result = new JPanel();
+ result.setLayout(new BoxLayout(result, BoxLayout.LINE_AXIS));
final JPanel panel = new JPanel(new VerticalFlowLayout());
- panel.setBorder(IdeBorderFactory.createTitledBorder("EditorConfig", false));
+ result.setBorder(IdeBorderFactory.createTitledBorder("EditorConfig", false));
panel.add(myEnabled);
final JLabel warning = new JLabel("EditorConfig may override the IDE code style settings");
warning.setFont(UIUtil.getLabelFont(UIUtil.FontSize.SMALL));
warning.setBorder(IdeBorderFactory.createEmptyBorder(0, 20, 0, 0));
panel.add(warning);
- return panel;
+ panel.setAlignmentY(Component.TOP_ALIGNMENT);
+ result.add(panel);
+ final JButton export = new JButton("Export");
+ export.addActionListener((event) -> {
+ final Component parent = UIUtil.findUltimateParent(result);
+ if (parent instanceof IdeFrame) {
+ Utils.export(((IdeFrame)parent).getProject());
+ }
+ });
+ export.setAlignmentY(Component.TOP_ALIGNMENT);
+ result.add(export);
+ return result;
}
@Override
diff --git a/plugins/git4idea/src/git4idea/config/GitVersionSpecialty.java b/plugins/git4idea/src/git4idea/config/GitVersionSpecialty.java
index 54325fd289e5..588e7fbcd717 100644
--- a/plugins/git4idea/src/git4idea/config/GitVersionSpecialty.java
+++ b/plugins/git4idea/src/git4idea/config/GitVersionSpecialty.java
@@ -140,6 +140,13 @@ public enum GitVersionSpecialty {
public boolean existsIn(@NotNull GitVersion version) {
return version.isLaterOrEqual(new GitVersion(1, 9, 0, 0));
}
+ },
+
+ LOG_AUTHOR_FILTER_SUPPORTS_VERTICAL_BAR {
+ @Override
+ public boolean existsIn(@NotNull GitVersion version) {
+ return !SystemInfo.isMac || version.isLaterOrEqual(new GitVersion(1, 8, 3, 3));
+ }
};
public abstract boolean existsIn(@NotNull GitVersion version);
diff --git a/plugins/git4idea/src/git4idea/history/GitHistoryProvider.java b/plugins/git4idea/src/git4idea/history/GitHistoryProvider.java
index 0e6e48c65c37..ececeb24c9d9 100644
--- a/plugins/git4idea/src/git4idea/history/GitHistoryProvider.java
+++ b/plugins/git4idea/src/git4idea/history/GitHistoryProvider.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2015 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -65,7 +65,7 @@ public class GitHistoryProvider implements VcsHistoryProviderEx, VcsCacheableHis
}
public VcsDependentHistoryComponents getUICustomization(final VcsHistorySession session, JComponent forShortcutRegistration) {
- return VcsDependentHistoryComponents.createOnlyColumns(new ColumnInfo[0]);
+ return VcsDependentHistoryComponents.createOnlyColumns(ColumnInfo.EMPTY_ARRAY);
}
public AnAction[] getAdditionalActions(Runnable refresher) {
diff --git a/plugins/git4idea/src/git4idea/log/GitLogProvider.java b/plugins/git4idea/src/git4idea/log/GitLogProvider.java
index 119e72de33bf..1b89ce1c83d0 100644
--- a/plugins/git4idea/src/git4idea/log/GitLogProvider.java
+++ b/plugins/git4idea/src/git4idea/log/GitLogProvider.java
@@ -52,6 +52,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
+import java.util.stream.Collectors;
public class GitLogProvider implements VcsLogProvider {
@@ -462,9 +463,12 @@ public class GitLogProvider implements VcsLogProvider {
}
if (filterCollection.getUserFilter() != null) {
- String authorFilter =
- StringUtil.join(ContainerUtil.map(filterCollection.getUserFilter().getUserNames(root), UserNameRegex.BASIC_INSTANCE), "\\|");
- filterParameters.add(prepareParameter("author", authorFilter));
+ List authors = ContainerUtil.map(filterCollection.getUserFilter().getUserNames(root), UserNameRegex.BASIC_INSTANCE);
+ if (GitVersionSpecialty.LOG_AUTHOR_FILTER_SUPPORTS_VERTICAL_BAR.existsIn(myVcs.getVersion())) {
+ filterParameters.add(prepareParameter("author", StringUtil.join(authors, "\\|")));
+ } else {
+ filterParameters.addAll(authors.stream().map(a -> prepareParameter("author", a)).collect(Collectors.toList()));
+ }
}
if (filterCollection.getDateFilter() != null) {
diff --git a/plugins/github/test/org/jetbrains/plugins/github/GithubCreateGistContentTest.java b/plugins/github/test/org/jetbrains/plugins/github/GithubCreateGistContentTest.java
index 4fc79bc26283..5dec1ac81a36 100644
--- a/plugins/github/test/org/jetbrains/plugins/github/GithubCreateGistContentTest.java
+++ b/plugins/github/test/org/jetbrains/plugins/github/GithubCreateGistContentTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -110,7 +110,7 @@ public class GithubCreateGistContentTest extends GithubCreateGistContentTestBase
public void testCreateFromEmptyFiles() throws Throwable {
List expected = new ArrayList();
- VirtualFile[] files = new VirtualFile[0];
+ VirtualFile[] files = VirtualFile.EMPTY_ARRAY;
List actual = GithubCreateGistAction.collectContents(myProject, null, null, files);
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleRerunFailedTestsAction.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleRerunFailedTestsAction.java
index d1c894d73b04..f26953d12bf5 100644
--- a/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleRerunFailedTestsAction.java
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleRerunFailedTestsAction.java
@@ -59,7 +59,7 @@ public class GradleRerunFailedTestsAction extends JavaRerunFailedTestsAction {
@NotNull
@Override
public Module[] getModules() {
- return new Module[0];
+ return Module.EMPTY_ARRAY;
}
@Nullable
diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/config/AbstractConfigUtils.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/config/AbstractConfigUtils.java
index 971d4ff5b1d1..86ac333f3a07 100644
--- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/config/AbstractConfigUtils.java
+++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/config/AbstractConfigUtils.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -140,7 +140,7 @@ public abstract class AbstractConfigUtils {
}
public Library[] getProjectSDKLibraries(Project project) {
- if (project == null || project.isDisposed()) return new Library[0];
+ if (project == null || project.isDisposed()) return Library.EMPTY_ARRAY;
final LibraryTable table = ProjectLibraryTable.getInstance(project);
final List all = ContainerUtil.findAll(table.getLibraries(), LIB_SEARCH_CONDITION);
return all.toArray(new Library[all.size()]);
diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/groovydoc/psi/impl/GrDocFieldReferenceImpl.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/groovydoc/psi/impl/GrDocFieldReferenceImpl.java
index 67b4250f41c3..69d5691d0472 100644
--- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/groovydoc/psi/impl/GrDocFieldReferenceImpl.java
+++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/groovydoc/psi/impl/GrDocFieldReferenceImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2015 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -108,7 +108,7 @@ public class GrDocFieldReferenceImpl extends GrDocMemberReferenceImpl implements
}
return candidates;
}
- return new ResolveResult[0];
+ return ResolveResult.EMPTY_ARRAY;
}
}
diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/groovydoc/psi/impl/GrDocMethodReferenceImpl.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/groovydoc/psi/impl/GrDocMethodReferenceImpl.java
index c807d5628d2d..34f53c04ef58 100644
--- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/groovydoc/psi/impl/GrDocMethodReferenceImpl.java
+++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/groovydoc/psi/impl/GrDocMethodReferenceImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -118,7 +118,7 @@ public class GrDocMethodReferenceImpl extends GrDocMemberReferenceImpl implement
resolved.processDeclarations(constructorProcessor, ResolveState.initial(), resolved, this);
return ArrayUtil.mergeArrays(processor.getCandidates(), constructorProcessor.getCandidates());
}
- return new ResolveResult[0];
+ return ResolveResult.EMPTY_ARRAY;
}
@Override
diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java
index e5e0add0b99b..460324c46c62 100644
--- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java
+++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java
@@ -317,7 +317,7 @@ public class PsiUtil {
if (namedArgs.length > 0) {
GrNamedArgument context = namedArgs[0];
- result.add(GrMapType.createFromNamedArgs(context, byShape ? new GrNamedArgument[0] : namedArgs));
+ result.add(GrMapType.createFromNamedArgs(context, byShape ? GrNamedArgument.EMPTY_ARRAY : namedArgs));
}
for (GrExpression expression : expressions) {
diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/util/LibrariesUtil.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/util/LibrariesUtil.java
index 5076e87faede..6a7e132d4e01 100644
--- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/util/LibrariesUtil.java
+++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/util/LibrariesUtil.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -39,7 +39,6 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.config.GroovyConfigUtils;
import java.io.File;
-import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@@ -55,7 +54,7 @@ public class LibrariesUtil {
}
public static Library[] getLibrariesByCondition(final Module module, final Condition condition) {
- if (module == null) return new Library[0];
+ if (module == null) return Library.EMPTY_ARRAY;
final ArrayList libraries = new ArrayList();
AccessToken accessToken = ApplicationManager.getApplication().acquireReadActionLock();
diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/util/dynamicMembers/GrDynamicMethodImpl.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/util/dynamicMembers/GrDynamicMethodImpl.java
index d1dead93a06b..478b9d8f8521 100644
--- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/util/dynamicMembers/GrDynamicMethodImpl.java
+++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/util/dynamicMembers/GrDynamicMethodImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -113,7 +113,7 @@ public class GrDynamicMethodImpl extends LightElement implements GrMethod {
@Override
@NotNull
public PsiMethod[] findDeepestSuperMethods() {
- return new PsiMethod[0];
+ return PsiMethod.EMPTY_ARRAY;
}
@Override
@@ -123,7 +123,7 @@ public class GrDynamicMethodImpl extends LightElement implements GrMethod {
@Override
public GrMember[] getMembers() {
- return new GrMember[0];
+ return GrMember.EMPTY_ARRAY;
}
@Override
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/CreateClassFix.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/CreateClassFix.java
index 776b7777a240..6ed1bc3411b7 100644
--- a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/CreateClassFix.java
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/CreateClassFix.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -137,7 +137,7 @@ public abstract class CreateClassFix {
method = (GrMethod)targetClass.addBefore(method, null);
final PsiElement context = PsiTreeUtil.getParentOfType(refElement, PsiMethod.class, PsiClass.class, PsiFile.class);
- IntentionUtils.createTemplateForMethod(argTypes, paramTypesExpressions, method, targetClass, new TypeConstraint[0], true, context);
+ IntentionUtils.createTemplateForMethod(argTypes, paramTypesExpressions, method, targetClass, TypeConstraint.EMPTY_ARRAY, true, context);
}
finally {
writeLock.finish();
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyColorsAndFontsPage.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyColorsAndFontsPage.java
index 1319b7e5161d..1437d6af8b75 100644
--- a/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyColorsAndFontsPage.java
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyColorsAndFontsPage.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -94,7 +94,7 @@ public class GroovyColorsAndFontsPage implements ColorSettingsPage {
@Override
@NotNull
public ColorDescriptor[] getColorDescriptors() {
- return new ColorDescriptor[0];
+ return ColorDescriptor.EMPTY_ARRAY;
}
@Override
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/smartEnter/GroovySmartEnterProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/smartEnter/GroovySmartEnterProcessor.java
index b79d652a826d..e52fb2c6953c 100644
--- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/smartEnter/GroovySmartEnterProcessor.java
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/smartEnter/GroovySmartEnterProcessor.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -194,7 +194,7 @@ public class GroovySmartEnterProcessor extends SmartEnterProcessorWithFixers {
private static PsiElement[] getChildren(PsiElement element) {
PsiElement psiChild = element.getFirstChild();
- if (psiChild == null) return new PsiElement[0];
+ if (psiChild == null) return PsiElement.EMPTY_ARRAY;
List result = new ArrayList();
while (psiChild != null) {
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/memberPullUp/GrPullUpConflictsUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/memberPullUp/GrPullUpConflictsUtil.java
index 5692e834cec0..5bb58006d9cd 100644
--- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/memberPullUp/GrPullUpConflictsUtil.java
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/memberPullUp/GrPullUpConflictsUtil.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -144,7 +144,7 @@ public class GrPullUpConflictsUtil {
ContainerUtil.addIfNotNull(checkModuleConflictsList, method.getReturnTypeElement());
ContainerUtil.addIfNotNull(checkModuleConflictsList, method.getTypeParameterList());
}
- GrRefactoringConflictsUtil.analyzeModuleConflicts(subclass.getProject(), checkModuleConflictsList, new UsageInfo[0], targetRepresentativeElement, conflicts);
+ GrRefactoringConflictsUtil.analyzeModuleConflicts(subclass.getProject(), checkModuleConflictsList, UsageInfo.EMPTY_ARRAY, targetRepresentativeElement, conflicts);
final String fqName = subclass.getQualifiedName();
final String packageName;
if (fqName != null) {
diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/log/HgRefManager.java b/plugins/hg4idea/src/org/zmlx/hg4idea/log/HgRefManager.java
index fe3a08730058..48a0879c269e 100644
--- a/plugins/hg4idea/src/org/zmlx/hg4idea/log/HgRefManager.java
+++ b/plugins/hg4idea/src/org/zmlx/hg4idea/log/HgRefManager.java
@@ -42,7 +42,7 @@ public class HgRefManager implements VcsLogRefManager {
public static final VcsRefType TAG = new SimpleRefType(false, VcsLogStandardColors.Refs.TAG);
public static final VcsRefType LOCAL_TAG = new SimpleRefType(false, LOCAL_TAG_COLOR);
public static final VcsRefType MQ_APPLIED_TAG = new SimpleRefType(false, MQ_TAG_COLOR);
-
+
// first has the highest priority
private static final List REF_TYPE_PRIORITIES = Arrays.asList(TIP, HEAD, BRANCH, BOOKMARK, TAG);
@@ -71,18 +71,19 @@ public class HgRefManager implements VcsLogRefManager {
return typeComparison;
}
- if (type1 == BRANCH) {
- if (ref1.getName().equals(DEFAULT)) {
- return -1;
- }
- if (ref2.getName().equals(DEFAULT)) {
- return 1;
- }
- }
int nameComparison = ref1.getName().compareTo(ref2.getName());
if (nameComparison != 0) {
+ if (type1 == BRANCH) {
+ if (ref1.getName().equals(DEFAULT)) {
+ return -1;
+ }
+ if (ref2.getName().equals(DEFAULT)) {
+ return 1;
+ }
+ }
return nameComparison;
}
+
return VcsLogUtil.compareRoots(ref1.getRoot(), ref2.getRoot());
}
};
diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgHistoryProvider.java b/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgHistoryProvider.java
index 13600b9c029d..a4625d4af521 100644
--- a/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgHistoryProvider.java
+++ b/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgHistoryProvider.java
@@ -57,7 +57,7 @@ public class HgHistoryProvider implements VcsHistoryProvider {
public VcsDependentHistoryComponents getUICustomization(VcsHistorySession session,
JComponent forShortcutRegistration) {
- return VcsDependentHistoryComponents.createOnlyColumns(new ColumnInfo[0]);
+ return VcsDependentHistoryComponents.createOnlyColumns(ColumnInfo.EMPTY_ARRAY);
}
public AnAction[] getAdditionalActions(Runnable runnable) {
diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxNamespaceDescriptor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxNamespaceDescriptor.java
index f6cdd51a0807..d2c8bfd0e1ae 100644
--- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxNamespaceDescriptor.java
+++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxNamespaceDescriptor.java
@@ -11,7 +11,6 @@ import com.intellij.psi.xml.XmlDocument;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.ArrayUtil;
-import com.intellij.util.Processor;
import com.intellij.xml.XmlElementDescriptor;
import com.intellij.xml.XmlNSDescriptor;
import org.jetbrains.annotations.NotNull;
@@ -59,7 +58,7 @@ public class JavaFxNamespaceDescriptor implements XmlNSDescriptor, Validator {
final Runnable callCleanupWorker = new Runnable() {
public void run() {
if (myProject.isDisposed()) return;
- new CleanupWorker(new VirtualFile[]{}, myProject, "action.Subversion.cleanup.progress.title") {
+ new CleanupWorker(VirtualFile.EMPTY_ARRAY, myProject, "action.Subversion.cleanup.progress.title") {
@Override
protected void chanceToFillRoots() {
final List infos = getAllWcInfos();
diff --git a/plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnChangesCorrectlyRefreshedNativeTest.java b/plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnChangesCorrectlyRefreshedNativeTest.java
index 5143b76be991..a279d2deecbe 100644
--- a/plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnChangesCorrectlyRefreshedNativeTest.java
+++ b/plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnChangesCorrectlyRefreshedNativeTest.java
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2000-2016 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package org.jetbrains.idea.svn;
import com.intellij.openapi.fileEditor.impl.LoadTextUtil;
@@ -78,7 +93,7 @@ public class SvnChangesCorrectlyRefreshedNativeTest extends Svn17TestCase {
VcsDirtyScopeManager.getInstance(myProject).markEverythingDirty();
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Test
@@ -104,7 +119,7 @@ public class SvnChangesCorrectlyRefreshedNativeTest extends Svn17TestCase {
assertVF(subTree.mySourceDir, "s1.txt");
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Test
@@ -129,7 +144,7 @@ public class SvnChangesCorrectlyRefreshedNativeTest extends Svn17TestCase {
assertVF(subTree.mySourceDir, "s1.txt");
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Test
@@ -161,7 +176,7 @@ public class SvnChangesCorrectlyRefreshedNativeTest extends Svn17TestCase {
assertVF(subTree.mySourceDir, "s2.txt");
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Test
@@ -197,7 +212,7 @@ public class SvnChangesCorrectlyRefreshedNativeTest extends Svn17TestCase {
Assert.assertEquals(SubTree.ourS1Contents, text.toString());
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Test
@@ -220,7 +235,7 @@ public class SvnChangesCorrectlyRefreshedNativeTest extends Svn17TestCase {
assertVF(subTree.myRootDir, "target");
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
for (VirtualFile file : files) {
Assert.assertTrue(file.getPath(), clManager.isUnversioned(file));
@@ -263,7 +278,7 @@ public class SvnChangesCorrectlyRefreshedNativeTest extends Svn17TestCase {
assertVF(subTree.myTargetDir, "t15.txt");
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Nullable
diff --git a/plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnChangesCorrectlyRefreshedTest.java b/plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnChangesCorrectlyRefreshedTest.java
index e13959d3a288..732b058e74f8 100644
--- a/plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnChangesCorrectlyRefreshedTest.java
+++ b/plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnChangesCorrectlyRefreshedTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2012 JetBrains s.r.o.
+ * Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -86,7 +86,7 @@ public class SvnChangesCorrectlyRefreshedTest extends Svn17TestCase {
VcsDirtyScopeManager.getInstance(myProject).markEverythingDirty();
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Test
@@ -112,7 +112,7 @@ public class SvnChangesCorrectlyRefreshedTest extends Svn17TestCase {
assertVF(subTree.mySourceDir, "s1.txt");
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Test
@@ -137,7 +137,7 @@ public class SvnChangesCorrectlyRefreshedTest extends Svn17TestCase {
assertVF(subTree.mySourceDir, "s1.txt");
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Test
@@ -169,7 +169,7 @@ public class SvnChangesCorrectlyRefreshedTest extends Svn17TestCase {
assertVF(subTree.mySourceDir, "s2.txt");
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Test
@@ -205,7 +205,7 @@ public class SvnChangesCorrectlyRefreshedTest extends Svn17TestCase {
Assert.assertEquals(SubTree.ourS1Contents, text.toString());
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Test
@@ -228,7 +228,7 @@ public class SvnChangesCorrectlyRefreshedTest extends Svn17TestCase {
assertVF(subTree.myRootDir, "target");
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
for (VirtualFile file : files) {
Assert.assertTrue(file.getPath(), clManager.isUnversioned(file));
@@ -271,7 +271,7 @@ public class SvnChangesCorrectlyRefreshedTest extends Svn17TestCase {
assertVF(subTree.myTargetDir, "t15.txt");
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Nullable
diff --git a/plugins/svn4idea/testSource/org/jetbrains/idea/svn16/SvnChangesCorrectlyRefreshedNativeTest.java b/plugins/svn4idea/testSource/org/jetbrains/idea/svn16/SvnChangesCorrectlyRefreshedNativeTest.java
index 6ffd3cef8cf8..54c751c42fb8 100644
--- a/plugins/svn4idea/testSource/org/jetbrains/idea/svn16/SvnChangesCorrectlyRefreshedNativeTest.java
+++ b/plugins/svn4idea/testSource/org/jetbrains/idea/svn16/SvnChangesCorrectlyRefreshedNativeTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -93,7 +93,7 @@ public class SvnChangesCorrectlyRefreshedNativeTest extends Svn17TestCase {
VcsDirtyScopeManager.getInstance(myProject).markEverythingDirty();
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Test
@@ -119,7 +119,7 @@ public class SvnChangesCorrectlyRefreshedNativeTest extends Svn17TestCase {
assertVF(subTree.mySourceDir, "s1.txt");
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Test
@@ -144,7 +144,7 @@ public class SvnChangesCorrectlyRefreshedNativeTest extends Svn17TestCase {
assertVF(subTree.mySourceDir, "s1.txt");
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Test
@@ -176,7 +176,7 @@ public class SvnChangesCorrectlyRefreshedNativeTest extends Svn17TestCase {
assertVF(subTree.mySourceDir, "s2.txt");
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Test
@@ -212,7 +212,7 @@ public class SvnChangesCorrectlyRefreshedNativeTest extends Svn17TestCase {
Assert.assertEquals(SubTree.ourS1Contents, text.toString());
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Test
@@ -235,7 +235,7 @@ public class SvnChangesCorrectlyRefreshedNativeTest extends Svn17TestCase {
assertVF(subTree.myRootDir, "target");
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
for (VirtualFile file : files) {
Assert.assertTrue(file.getPath(), clManager.isUnversioned(file));
@@ -278,7 +278,7 @@ public class SvnChangesCorrectlyRefreshedNativeTest extends Svn17TestCase {
assertVF(subTree.myTargetDir, "t15.txt");
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Nullable
diff --git a/plugins/svn4idea/testSource/org/jetbrains/idea/svn16/SvnChangesCorrectlyRefreshedTest.java b/plugins/svn4idea/testSource/org/jetbrains/idea/svn16/SvnChangesCorrectlyRefreshedTest.java
index 5bfe54fbf7ec..bb5080084984 100644
--- a/plugins/svn4idea/testSource/org/jetbrains/idea/svn16/SvnChangesCorrectlyRefreshedTest.java
+++ b/plugins/svn4idea/testSource/org/jetbrains/idea/svn16/SvnChangesCorrectlyRefreshedTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2012 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -112,7 +112,7 @@ public class SvnChangesCorrectlyRefreshedTest extends Svn16TestCase {
VcsDirtyScopeManager.getInstance(myProject).markEverythingDirty();
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Test
@@ -138,7 +138,7 @@ public class SvnChangesCorrectlyRefreshedTest extends Svn16TestCase {
assertVF(subTree.mySourceDir, "s1.txt");
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Test
@@ -163,7 +163,7 @@ public class SvnChangesCorrectlyRefreshedTest extends Svn16TestCase {
assertVF(subTree.mySourceDir, "s1.txt");
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Test
@@ -195,7 +195,7 @@ public class SvnChangesCorrectlyRefreshedTest extends Svn16TestCase {
assertVF(subTree.mySourceDir, "s2.txt");
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Test
@@ -231,7 +231,7 @@ public class SvnChangesCorrectlyRefreshedTest extends Svn16TestCase {
Assert.assertEquals(SubTree.ourS1Contents, text.toString());
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Test
@@ -254,7 +254,7 @@ public class SvnChangesCorrectlyRefreshedTest extends Svn16TestCase {
assertVF(subTree.myRootDir, "target");
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
for (VirtualFile file : files) {
Assert.assertTrue(file.getPath(), clManager.isUnversioned(file));
@@ -297,7 +297,7 @@ public class SvnChangesCorrectlyRefreshedTest extends Svn16TestCase {
assertVF(subTree.myTargetDir, "t15.txt");
clManager.ensureUpToDate(false);
- DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager);
+ DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(VirtualFile.EMPTY_ARRAY, clManager.getDefaultListName(), clManager);
}
@Nullable
diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/LocalTaskImpl.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/LocalTaskImpl.java
index 0f96aed5c2f8..63eadd378ef8 100644
--- a/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/LocalTaskImpl.java
+++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/LocalTaskImpl.java
@@ -1,17 +1,17 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2016 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
+ * 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
+ * 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.
+ * 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.tasks.impl;
@@ -47,7 +47,7 @@ public class LocalTaskImpl extends LocalTask {
private String myId = "";
private String mySummary = "";
private String myDescription = null;
- private Comment[] myComments = new Comment[0];
+ private Comment[] myComments = Comment.EMPTY_ARRAY;
private boolean myClosed = false;
private Date myCreated;
private Date myUpdated;
diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/lighthouse/LighthouseRepository.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/lighthouse/LighthouseRepository.java
index 61a50d5c9b3e..672479abc587 100644
--- a/plugins/tasks/tasks-core/src/com/intellij/tasks/lighthouse/LighthouseRepository.java
+++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/lighthouse/LighthouseRepository.java
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2000-2016 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.tasks.lighthouse;
import com.intellij.openapi.diagnostic.Logger;
@@ -158,7 +173,7 @@ public class LighthouseRepository extends BaseRepositoryImpl {
@NotNull
@Override
public Comment[] getComments() {
- return new Comment[0];
+ return Comment.EMPTY_ARRAY;
}
@NotNull
diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/trac/TracRepository.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/trac/TracRepository.java
index ffcaa23a2168..153178dcf1b5 100644
--- a/plugins/tasks/tasks-core/src/com/intellij/tasks/trac/TracRepository.java
+++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/trac/TracRepository.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2015 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -148,7 +148,7 @@ public class TracRepository extends BaseRepositoryImpl {
@NotNull
@Override
public Comment[] getComments() {
- return new Comment[0];
+ return Comment.EMPTY_ARRAY;
}
@NotNull
diff --git a/plugins/tasks/tasks-tests/test/com/intellij/tasks/vcs/TaskVcsTest.java b/plugins/tasks/tasks-tests/test/com/intellij/tasks/vcs/TaskVcsTest.java
index dcfc7f0e5b67..fcd17ae4cb21 100644
--- a/plugins/tasks/tasks-tests/test/com/intellij/tasks/vcs/TaskVcsTest.java
+++ b/plugins/tasks/tasks-tests/test/com/intellij/tasks/vcs/TaskVcsTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2015 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -425,7 +425,7 @@ public class TaskVcsTest extends CodeInsightFixtureTestCase {
@NotNull
@Override
public Comment[] getComments() {
- return new Comment[0];
+ return Comment.EMPTY_ARRAY;
}
@NotNull
diff --git a/plugins/testng/src/com/theoryinpractice/testng/inspection/DependsOnGroupsInspection.java b/plugins/testng/src/com/theoryinpractice/testng/inspection/DependsOnGroupsInspection.java
index 3727a250d8a3..586ed4fbf07e 100644
--- a/plugins/testng/src/com/theoryinpractice/testng/inspection/DependsOnGroupsInspection.java
+++ b/plugins/testng/src/com/theoryinpractice/testng/inspection/DependsOnGroupsInspection.java
@@ -139,7 +139,7 @@ public class DependsOnGroupsInspection extends BaseJavaLocalInspectionTool {
}
}
}
- return problemDescriptors.toArray(new ProblemDescriptor[]{});
+ return problemDescriptors.toArray(ProblemDescriptor.EMPTY_ARRAY);
}
private class GroupNameQuickFix implements LocalQuickFix {
diff --git a/plugins/ui-designer-core/src/com/intellij/designer/model/EmptyXmlTag.java b/plugins/ui-designer-core/src/com/intellij/designer/model/EmptyXmlTag.java
index f96cc95d91db..5260402a0420 100644
--- a/plugins/ui-designer-core/src/com/intellij/designer/model/EmptyXmlTag.java
+++ b/plugins/ui-designer-core/src/com/intellij/designer/model/EmptyXmlTag.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2012 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -76,7 +76,7 @@ public class EmptyXmlTag implements XmlTag {
@NotNull
@Override
public XmlAttribute[] getAttributes() {
- return new XmlAttribute[0];
+ return XmlAttribute.EMPTY_ARRAY;
}
@Override
@@ -125,19 +125,19 @@ public class EmptyXmlTag implements XmlTag {
@NotNull
@Override
public XmlTag[] getSubTags() {
- return new XmlTag[0];
+ return XmlTag.EMPTY;
}
@NotNull
@Override
public XmlTag[] findSubTags(@NonNls String qname) {
- return new XmlTag[0];
+ return XmlTag.EMPTY;
}
@NotNull
@Override
public XmlTag[] findSubTags(@NonNls String localName, @NonNls String namespace) {
- return new XmlTag[0];
+ return XmlTag.EMPTY;
}
@Override
@@ -185,13 +185,13 @@ public class EmptyXmlTag implements XmlTag {
@NotNull
@Override
public XmlTagChild[] getChildren() {
- return new XmlTagChild[0];
+ return XmlTagChild.EMPTY_ARRAY;
}
@NotNull
@Override
public XmlText[] getTextElements() {
- return new XmlText[0];
+ return XmlText.EMPTY_ARRAY;
}
@NotNull
@@ -287,7 +287,7 @@ public class EmptyXmlTag implements XmlTag {
@NotNull
@Override
public PsiElement[] getChildren() {
- return new PsiElement[0];
+ return PsiElement.EMPTY_ARRAY;
}
@Override
@@ -475,7 +475,7 @@ public class EmptyXmlTag implements XmlTag {
@NotNull
@Override
public PsiReference[] getReferences() {
- return new PsiReference[0];
+ return PsiReference.EMPTY_ARRAY;
}
@Override
diff --git a/plugins/ui-designer/ui-designer.iml b/plugins/ui-designer/ui-designer.iml
index e6a868e99465..eca27c766b69 100644
--- a/plugins/ui-designer/ui-designer.iml
+++ b/plugins/ui-designer/ui-designer.iml
@@ -19,7 +19,7 @@
-
+
@@ -35,5 +35,4 @@
-
-
+
\ No newline at end of file
diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/XPathColorSettingsPage.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/XPathColorSettingsPage.java
index 491ac8dd250d..1473bbc4af72 100644
--- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/XPathColorSettingsPage.java
+++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/XPathColorSettingsPage.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -65,7 +65,7 @@ public class XPathColorSettingsPage implements ColorSettingsPage {
@NotNull
public ColorDescriptor[] getColorDescriptors() {
- return new ColorDescriptor[0];
+ return ColorDescriptor.EMPTY_ARRAY;
}
@NotNull
diff --git a/plugins/yaml/src/org/jetbrains/yaml/YAMLColorsPage.java b/plugins/yaml/src/org/jetbrains/yaml/YAMLColorsPage.java
index 30c54292a437..40ff26d51184 100644
--- a/plugins/yaml/src/org/jetbrains/yaml/YAMLColorsPage.java
+++ b/plugins/yaml/src/org/jetbrains/yaml/YAMLColorsPage.java
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2000-2016 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package org.jetbrains.yaml;
import com.intellij.icons.AllIcons;
@@ -46,8 +61,6 @@ public class YAMLColorsPage implements ColorSettingsPage {
// Empty still
private static final Map ADDITIONAL_HIGHLIGHT_DESCRIPTORS = new HashMap();
- private static final ColorDescriptor[] COLORS = new ColorDescriptor[0];
-
@Nullable
public Map getAdditionalHighlightingTagToDescriptorMap() {
return ADDITIONAL_HIGHLIGHT_DESCRIPTORS;
@@ -70,7 +83,7 @@ public class YAMLColorsPage implements ColorSettingsPage {
@NotNull
public ColorDescriptor[] getColorDescriptors() {
- return COLORS;
+ return ColorDescriptor.EMPTY_ARRAY;
}
@NotNull
diff --git a/python/educational-core/build.gradle b/python/educational-core/build.gradle
index 3a0713eb64bd..fa978c18942b 100644
--- a/python/educational-core/build.gradle
+++ b/python/educational-core/build.gradle
@@ -1,7 +1,7 @@
import org.apache.tools.ant.filters.ReplaceTokens
buildscript {
- ext.kotlin_version = '1.0.2'
+ ext.kotlin_version = '1.0.3'
repositories {
mavenCentral()
}
diff --git a/python/educational-core/gradle.properties b/python/educational-core/gradle.properties
index cef4aabef98a..38b89a6b45a1 100644
--- a/python/educational-core/gradle.properties
+++ b/python/educational-core/gradle.properties
@@ -1,6 +1,6 @@
ideaVersion IC-162-SNAPSHOT
downloadIdeaSources false
version 2.0.5
-buildNumber 162.75
+buildNumber 162.1121.10
javaVersion 1.8
updateBuildNumber false
\ No newline at end of file
diff --git a/python/educational-python/build.gradle b/python/educational-python/build.gradle
index 9818379af820..9522fa071190 100644
--- a/python/educational-python/build.gradle
+++ b/python/educational-python/build.gradle
@@ -1,11 +1,22 @@
import org.apache.tools.ant.filters.ReplaceTokens
+buildscript {
+ ext.kotlin_version = '1.0.3'
+ repositories {
+ mavenCentral()
+ }
+ dependencies {
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
plugins {
id "org.jetbrains.intellij" version "0.0.39"
}
subprojects {
apply plugin: 'java'
+ apply plugin: 'kotlin'
apply plugin: "org.jetbrains.intellij"
tasks.withType(JavaCompile) { options.encoding = 'UTF-8' }
@@ -13,7 +24,7 @@ subprojects {
sourceSets {
main {
java.srcDirs 'src', '../src', '../gen'
- resources.srcDirs 'resources'
+ kotlin.srcDirs 'src'
resources.srcDirs 'resources', '../resources'
}
test {
diff --git a/python/educational-python/gradle.properties b/python/educational-python/gradle.properties
index f4bea5c8b3f6..e6fec73c49e3 100644
--- a/python/educational-python/gradle.properties
+++ b/python/educational-python/gradle.properties
@@ -1,7 +1,7 @@
-ideaVersion IC-2016.1
+ideaVersion IC-162-SNAPSHOT
downloadIdeaSources false
version 2.0.5
-buildNumber 162.75
+buildNumber 162.1121.10
javaVersion 1.8
pycharmVersion 162.75
updateBuildNumber false
\ No newline at end of file
diff --git a/python/helpers/pydev/_pydev_bundle/pydev_console_utils.py b/python/helpers/pydev/_pydev_bundle/pydev_console_utils.py
index c9078e14457d..bbc37965ec58 100644
--- a/python/helpers/pydev/_pydev_bundle/pydev_console_utils.py
+++ b/python/helpers/pydev/_pydev_bundle/pydev_console_utils.py
@@ -189,10 +189,13 @@ class BaseInterpreterInterface:
return self.need_more_for_code(self.buffer.text)
- def create_std_in(self):
- return StdIn(self, self.host, self.client_port)
+ def create_std_in(self, debugger=None, original_std_in=None):
+ if debugger is None:
+ return StdIn(self, self.host, self.client_port)
+ else:
+ return DebugConsoleStdIn(dbg=debugger, original_stdin=original_std_in)
- def add_exec(self, code_fragment):
+ def add_exec(self, code_fragment, debugger=None):
original_in = sys.stdin
try:
help = None
@@ -210,7 +213,7 @@ class BaseInterpreterInterface:
more = False
try:
- sys.stdin = self.create_std_in()
+ sys.stdin = self.create_std_in(debugger, original_in)
try:
if help is not None:
#This will enable the help() function to work.
diff --git a/python/helpers/pydev/_pydevd_bundle/pydevd_comm.py b/python/helpers/pydev/_pydevd_bundle/pydevd_comm.py
index ec0c13d692b5..85d3267e9c73 100644
--- a/python/helpers/pydev/_pydevd_bundle/pydevd_comm.py
+++ b/python/helpers/pydev/_pydevd_bundle/pydevd_comm.py
@@ -1331,7 +1331,7 @@ class InternalConsoleExec(InternalThreadCommand):
#don't trace new threads created by console command
disable_trace_thread_modules()
- result = pydevconsole.console_exec(self.thread_id, self.frame_id, self.expression)
+ result = pydevconsole.console_exec(self.thread_id, self.frame_id, self.expression, dbg)
xml = ""
xml += pydevd_vars.var_to_xml(result, "")
xml += ""
diff --git a/python/helpers/pydev/pydevconsole.py b/python/helpers/pydev/pydevconsole.py
index 2ef4df593fb6..5beab3126b80 100644
--- a/python/helpers/pydev/pydevconsole.py
+++ b/python/helpers/pydev/pydevconsole.py
@@ -374,7 +374,7 @@ def get_completions(text, token, globals, locals):
# Debugger integration
#===============================================================================
-def exec_code(code, globals, locals):
+def exec_code(code, globals, locals, debugger):
interpreterInterface = get_interpreter()
interpreterInterface.interpreter.update(globals, locals)
@@ -383,7 +383,7 @@ def exec_code(code, globals, locals):
if res:
return True
- interpreterInterface.add_exec(code)
+ interpreterInterface.add_exec(code, debugger)
return False
@@ -443,7 +443,7 @@ class ConsoleWriter(InteractiveInterpreter):
tblist = tb = None
sys.stderr.write(''.join(lines))
-def console_exec(thread_id, frame_id, expression):
+def console_exec(thread_id, frame_id, expression, dbg):
"""returns 'False' in case expression is partially correct
"""
frame = pydevd_vars.find_frame(thread_id, frame_id)
@@ -458,7 +458,7 @@ def console_exec(thread_id, frame_id, expression):
updated_globals.update(frame.f_locals) #locals later because it has precedence over the actual globals
if IPYTHON:
- need_more = exec_code(CodeFragment(expression), updated_globals, frame.f_locals)
+ need_more = exec_code(CodeFragment(expression), updated_globals, frame.f_locals, dbg)
if not need_more:
pydevd_save_locals.save_locals(frame)
return need_more
diff --git a/python/helpers/tools/versions.xml b/python/helpers/tools/versions.xml
index a89ba6e8d570..4c6bc1e9306d 100644
--- a/python/helpers/tools/versions.xml
+++ b/python/helpers/tools/versions.xml
@@ -112,7 +112,6 @@
bsddb.test.test_sequence
build_class
builtins
- bz2
cProfile
collections
collections.__main__
@@ -859,7 +858,6 @@
bsddb.test.test_sequence
build_class
builtins
- bz2
cProfile
collections.__main__
collections.abc
@@ -1548,7 +1546,6 @@
bsddb.test.test_replication
build_class
builtins
- bz2
collections.__main__
collections.abc
concurrent
@@ -2128,7 +2125,6 @@
bsddb.test.test_fileid
build_class
builtins
- bz2
collections.__main__
collections.abc
concurrent
@@ -2541,7 +2537,6 @@
bsddb.test.test_env_close
build_class
builtins
- bz2
collections.__main__
collections.abc
concurrent
@@ -2941,7 +2936,6 @@
bsddb.test.test_replication
bsddb.test.test_sequence
bsddb.test.test_thread
- bz2
cPickle
cStringIO
collections.__main__
@@ -3480,7 +3474,6 @@
bsddb.test.test_sequence
bsddb.test.test_thread
build_class
- bz2
cPickle
cStringIO
collections.__main__
@@ -3926,7 +3919,6 @@
bsddb.test.test_sequence
bsddb.test.test_thread
build_class
- bz2
cPickle
cStringIO
collections.__main__
@@ -4232,7 +4224,6 @@
_abcoll
_bootlocale
_bytesio
- _bz2
_collections_abc
_compression
_fileio
@@ -4597,7 +4588,6 @@
__main__
_abcoll
_bytesio
- _bz2
_compression
_fileio
_hotshot
diff --git a/python/ide/src/com/jetbrains/python/PyDirectoryIndexExcludePolicy.java b/python/ide/src/com/jetbrains/python/PyDirectoryIndexExcludePolicy.java
index b5a671a5f28f..01dfbae6970b 100644
--- a/python/ide/src/com/jetbrains/python/PyDirectoryIndexExcludePolicy.java
+++ b/python/ide/src/com/jetbrains/python/PyDirectoryIndexExcludePolicy.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2015 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -56,6 +56,6 @@ public class PyDirectoryIndexExcludePolicy implements DirectoryIndexExcludePolic
public VirtualFilePointer[] getExcludeRootsForModule(@NotNull ModuleRootModel rootModel) {
- return new VirtualFilePointer[0];
+ return VirtualFilePointer.EMPTY_ARRAY;
}
}
diff --git a/python/openapi/src/com/jetbrains/python/psi/PyStringLiteralFileReferenceSet.java b/python/openapi/src/com/jetbrains/python/psi/PyStringLiteralFileReferenceSet.java
index 2aacbc8735c1..8dbd96344776 100644
--- a/python/openapi/src/com/jetbrains/python/psi/PyStringLiteralFileReferenceSet.java
+++ b/python/openapi/src/com/jetbrains/python/psi/PyStringLiteralFileReferenceSet.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2016 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,7 +41,8 @@ public class PyStringLiteralFileReferenceSet extends RootFileReferenceSet {
}
public PyStringLiteralFileReferenceSet(@NotNull PyStringLiteralExpression element, boolean caseSensitive) {
- this(element.getStringValue(), element, element.getStringValueTextRange().getStartOffset(), null, caseSensitive, true, new FileType[0]);
+ this(element.getStringValue(), element, element.getStringValueTextRange().getStartOffset(), null, caseSensitive, true,
+ FileType.EMPTY_ARRAY);
}
public PyStringLiteralFileReferenceSet(@NotNull String str,
diff --git a/python/psi-api/src/com/jetbrains/python/PyNames.java b/python/psi-api/src/com/jetbrains/python/PyNames.java
index 4b55f49acdb0..174db221d0c5 100644
--- a/python/psi-api/src/com/jetbrains/python/PyNames.java
+++ b/python/psi-api/src/com/jetbrains/python/PyNames.java
@@ -165,6 +165,7 @@ public class PyNames {
public static final String DIV = "__div__";
public static final String TRUEDIV = "__truediv__";
public static final String AITER = "__aiter__";
+ public static final String SIZEOF = "__sizeof__";
public static final String NAME = "__name__";
public static final String ENTER = "__enter__";
diff --git a/python/psi-api/src/com/jetbrains/python/psi/impl/PyPsiUtils.java b/python/psi-api/src/com/jetbrains/python/psi/impl/PyPsiUtils.java
index 8dba1d02da9b..46f07970447a 100644
--- a/python/psi-api/src/com/jetbrains/python/psi/impl/PyPsiUtils.java
+++ b/python/psi-api/src/com/jetbrains/python/psi/impl/PyPsiUtils.java
@@ -19,7 +19,6 @@ import com.google.common.base.Preconditions;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
-import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.Couple;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
@@ -604,6 +603,14 @@ public class PyPsiUtils {
Preconditions.checkArgument(!module.isDisposed(), String.format("Module %s is disposed", module));
}
+ @NotNull
+ public static PsiFileSystemItem getFileSystemItem(@NotNull PsiElement element) {
+ if (element instanceof PsiFileSystemItem) {
+ return (PsiFileSystemItem)element;
+ }
+ return element.getContainingFile();
+ }
+
private static abstract class TopLevelVisitor extends PyRecursiveElementVisitor {
public void visitPyElement(final PyElement node) {
super.visitPyElement(node);
diff --git a/python/python-community-configure/src/com/jetbrains/python/configuration/PythonSdkDetailsDialog.java b/python/python-community-configure/src/com/jetbrains/python/configuration/PythonSdkDetailsDialog.java
index ed458a4e9938..f800d97e41bb 100644
--- a/python/python-community-configure/src/com/jetbrains/python/configuration/PythonSdkDetailsDialog.java
+++ b/python/python-community-configure/src/com/jetbrains/python/configuration/PythonSdkDetailsDialog.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -47,7 +47,6 @@ import com.intellij.remote.RemoteSdkAdditionalData;
import com.intellij.ui.*;
import com.intellij.ui.components.JBList;
import com.intellij.util.NullableConsumer;
-import com.intellij.util.NullableFunction;
import com.intellij.util.PathMappingSettings;
import com.intellij.util.containers.FactoryMap;
import com.jetbrains.python.PyBundle;
@@ -564,7 +563,7 @@ public class PythonSdkDetailsDialog extends DialogWrapper {
catch (Exception e) {
LOG.error(e);
}
- return new VirtualFile[0];
+ return VirtualFile.EMPTY_ARRAY;
}
@Override
diff --git a/python/src/com/jetbrains/python/codeInsight/imports/ImportFromExistingAction.java b/python/src/com/jetbrains/python/codeInsight/imports/ImportFromExistingAction.java
index e998ab07678a..02b95124f3dd 100644
--- a/python/src/com/jetbrains/python/codeInsight/imports/ImportFromExistingAction.java
+++ b/python/src/com/jetbrains/python/codeInsight/imports/ImportFromExistingAction.java
@@ -19,6 +19,7 @@ import com.intellij.codeInsight.hint.QuestionAction;
import com.intellij.ide.DataManager;
import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.openapi.actionSystem.DataContext;
+import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.colors.EditorColorsManager;
@@ -28,7 +29,10 @@ import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.ui.popup.PopupChooserBuilder;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.psi.*;
+import com.intellij.psi.PsiDocumentManager;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiFileSystemItem;
import com.intellij.psi.util.QualifiedName;
import com.intellij.ui.SimpleColoredComponent;
import com.intellij.ui.SimpleTextAttributes;
@@ -98,10 +102,12 @@ public class ImportFromExistingAction implements QuestionAction {
return false;
}
// act
- if (mySources.size() > 1) {
+ if (mySources.size() == 1 || ApplicationManager.getApplication().isUnitTestMode()) {
+ doWriteAction(mySources.get(0));
+ }
+ else {
selectSourceAndDo();
}
- else doWriteAction(mySources.get(0));
return true;
}
diff --git a/python/src/com/jetbrains/python/console/completion/PydevConsoleReference.java b/python/src/com/jetbrains/python/console/completion/PydevConsoleReference.java
index 5fe819f323b3..6fb65ae80ca0 100644
--- a/python/src/com/jetbrains/python/console/completion/PydevConsoleReference.java
+++ b/python/src/com/jetbrains/python/console/completion/PydevConsoleReference.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -59,7 +59,7 @@ public class PydevConsoleReference extends PsiPolyVariantReferenceBase resultsFromProcessor = getResultsFromProcessor(referencedName, processor, realContext, roof);
+
+ // resolve to module __doc__
+ if (resultsFromProcessor.isEmpty() && referencedName.equals(PyNames.DOC)) {
+ ret.addAll(
+ Optional
+ .ofNullable(PyBuiltinCache.getInstance(myElement).getObjectType())
+ .map(type -> type.resolveMember(referencedName, myElement, AccessDirection.of(myElement), myContext))
+ .orElse(Collections.emptyList())
+ );
+
+ return ret;
+ }
+
+ return resultsFromProcessor;
}
protected List getResultsFromProcessor(@NotNull String referencedName,
diff --git a/python/src/com/jetbrains/python/psi/resolve/QualifiedNameFinder.java b/python/src/com/jetbrains/python/psi/resolve/QualifiedNameFinder.java
index e87c189f361f..04029133f240 100644
--- a/python/src/com/jetbrains/python/psi/resolve/QualifiedNameFinder.java
+++ b/python/src/com/jetbrains/python/psi/resolve/QualifiedNameFinder.java
@@ -23,6 +23,7 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
+import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
@@ -30,7 +31,6 @@ import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyElement;
import com.jetbrains.python.psi.PyFile;
import com.jetbrains.python.psi.PyFunction;
-import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.psi.impl.PyBuiltinCache;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -85,13 +85,7 @@ public class QualifiedNameFinder {
@Nullable
private static QualifiedName shortestQName(@NotNull List qNames) {
- QualifiedName result = null;
- for (QualifiedName name : qNames) {
- if (result == null || name.getComponentCount() < result.getComponentCount()) {
- result = name;
- }
- }
- return result;
+ return qNames.stream().min((o1, o2) -> o1.getComponentCount() - o2.getComponentCount()).orElse(null);
}
@Nullable
@@ -142,8 +136,13 @@ public class QualifiedNameFinder {
if (initPy == null) {
break;
}
- if (initPy instanceof PyFile && toplevel.equals(((PyFile)initPy).getElementNamed(((PsiNamedElement)toplevel).getName()))) {
- virtualFile = dir.getVirtualFile();
+ if (initPy instanceof PyFile) {
+ //noinspection ConstantConditions
+ final List resolved = ((PyFile)initPy).multiResolveName(((PsiNamedElement)toplevel).getName());
+ final PsiElement finalTopLevel = toplevel;
+ if (resolved.stream().anyMatch(r -> r.getElement() == finalTopLevel)) {
+ virtualFile = dir.getVirtualFile();
+ }
}
dir = dir.getParentDirectory();
}
diff --git a/python/src/com/jetbrains/python/psi/resolve/QualifiedNameResolverImpl.java b/python/src/com/jetbrains/python/psi/resolve/QualifiedNameResolverImpl.java
index 5592b58c61c5..58b594e264a1 100644
--- a/python/src/com/jetbrains/python/psi/resolve/QualifiedNameResolverImpl.java
+++ b/python/src/com/jetbrains/python/psi/resolve/QualifiedNameResolverImpl.java
@@ -28,15 +28,13 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.FileIndexFacade;
import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.psi.PsiDirectory;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiFile;
-import com.intellij.psi.PsiNamedElement;
+import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.codeInsight.userSkeletons.PyUserSkeletonsUtil;
import com.jetbrains.python.console.PydevConsoleRunner;
import com.jetbrains.python.facet.PythonPathContributingFacet;
+import com.jetbrains.python.psi.LanguageLevel;
import com.jetbrains.python.psi.PyFile;
import com.jetbrains.python.psi.PyUtil;
import com.jetbrains.python.psi.impl.PyBuiltinCache;
@@ -44,6 +42,7 @@ import com.jetbrains.python.psi.impl.PyImportResolver;
import com.jetbrains.python.psi.impl.PyPsiUtils;
import com.jetbrains.python.sdk.PySdkUtil;
import com.jetbrains.python.sdk.PythonSdkType;
+import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -52,6 +51,8 @@ import java.util.Collections;
import java.util.List;
import java.util.Set;
+import static com.jetbrains.python.psi.PyUtil.as;
+
/**
* Resolves the specified qualified name in the specified context (module, all modules or a file) to a file or directory.
*
@@ -235,6 +236,7 @@ public class QualifiedNameResolverImpl implements RootVisitor, QualifiedNameReso
final PsiFile footholdFile = myContext.getFootholdFile();
checkValidForTests(footholdFile);
+ boolean foundRelativeImport = false;
if (myRelativeLevel >= 0 && footholdFile != null && !PyUserSkeletonsUtil.isUnderUserSkeletonsDirectory(footholdFile)) {
PsiDirectory dir = footholdFile.getContainingDirectory();
checkValidForTests(dir);
@@ -246,12 +248,13 @@ public class QualifiedNameResolverImpl implements RootVisitor, QualifiedNameReso
PsiElement module = resolveModuleAt(dir);
checkValidForTests(module);
if (module != null) {
+ foundRelativeImport = isRelativeImportResult(dir, module);
addRoot(module, true);
}
}
final PythonPathCache cache = findMyCache();
- final boolean mayCache = cache != null && !myWithoutRoots && !myWithoutForeign;
+ final boolean mayCache = cache != null && !myWithoutRoots && !myWithoutForeign && !foundRelativeImport;
if (mayCache) {
final List cachedResults = cache.get(myQualifiedName);
if (cachedResults != null) {
@@ -293,6 +296,22 @@ public class QualifiedNameResolverImpl implements RootVisitor, QualifiedNameReso
return results;
}
+
+ private boolean isRelativeImportResult(@NotNull PsiDirectory rootDirectory, @NotNull PsiElement result) {
+ if (myRelativeLevel > 0) {
+ return true;
+ }
+ final boolean isPython2 = LanguageLevel.forElement(rootDirectory).isOlderThan(LanguageLevel.PYTHON30);
+ if (myRelativeLevel == 0 && isPython2 && PyUtil.isPackage(rootDirectory, false, null)) {
+ // Candidate for implicit relative import doesn't necessarily means that the same module cannot be imported absolutely
+ final PsiFileSystemItem moduleOrPackage = as(result, PsiFileSystemItem.class);
+ if (moduleOrPackage != null && !myQualifiedName.equals(QualifiedNameFinder.findShortestImportableQName(moduleOrPackage))) {
+ return true;
+ }
+ }
+ return false;
+ }
+
/**
* Resolve relative imports from sdk root to the skeleton dir
*/
@@ -421,6 +440,7 @@ public class QualifiedNameResolverImpl implements RootVisitor, QualifiedNameReso
*
* @param directory where to start from; top qualifier will be searched for here.
*/
+ @Contract("null -> null")
@Nullable
public PsiElement resolveModuleAt(@Nullable PsiDirectory directory) {
// prerequisites
diff --git a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java
index 3660c809f15f..2c1c75042b59 100644
--- a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java
+++ b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java
@@ -195,10 +195,22 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType {
}
classMember = resolveClassMember(myClass, myIsDefinition, name, location);
+
+ if (PyNames.__CLASS__.equals(name)) {
+ return resolveDunderClass(context, classMember);
+ }
+
if (classMember != null) {
return ResolveResultList.to(classMember);
}
+ if (PyNames.DOC.equals(name)) {
+ return Optional
+ .ofNullable(PyBuiltinCache.getInstance(myClass).getObjectType())
+ .map(type -> type.resolveMember(name, location, direction, resolveContext))
+ .orElse(Collections.emptyList());
+ }
+
classMember = resolveByOverridingAncestorsMembersProviders(this, name, location);
if (classMember != null) {
final ResolveResultList list = new ResolveResultList();
@@ -293,6 +305,36 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType {
return resultRef;
}
+ @Nullable
+ private List extends RatedResolveResult> resolveDunderClass(@NotNull TypeEvalContext context, @Nullable PsiElement classMember) {
+ final boolean newStyleClass = myClass.isNewStyleClass(context);
+
+ if (!myIsDefinition) {
+ if (newStyleClass && classMember != null) {
+ return ResolveResultList.to(classMember);
+ }
+
+ return ResolveResultList.to(
+ myClass.getAncestorClasses(context)
+ .stream()
+ .filter(cls -> !PyUtil.isObjectClass(cls))
+ .map(cls -> cls.findClassAttribute(PyNames.__CLASS__, true, context))
+ .filter(target -> target != null)
+ .findFirst()
+ .orElse(myClass)
+ );
+ }
+
+ if (LanguageLevel.forElement(myClass).isOlderThan(LanguageLevel.PYTHON30) && !newStyleClass) {
+ return ResolveResultList.to(classMember);
+ }
+
+ return Optional
+ .ofNullable(PyBuiltinCache.getInstance(myClass).getTypeType())
+ .map(typeType -> ResolveResultList.to(typeType.getPyClass()))
+ .orElse(null);
+ }
+
@Nullable
@Override
public PyClassLikeType getMetaClassType(@NotNull final TypeEvalContext context, boolean inherited) {
diff --git a/python/src/com/jetbrains/python/refactoring/PyDefUseUtil.java b/python/src/com/jetbrains/python/refactoring/PyDefUseUtil.java
index f4d6af60cff1..8f764caf55bd 100644
--- a/python/src/com/jetbrains/python/refactoring/PyDefUseUtil.java
+++ b/python/src/com/jetbrains/python/refactoring/PyDefUseUtil.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,13 +21,12 @@ import com.intellij.codeInsight.controlflow.ControlFlowUtil;
import com.intellij.codeInsight.controlflow.Instruction;
import com.intellij.openapi.util.Comparing;
import com.intellij.psi.PsiElement;
-import com.intellij.util.Function;
+import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.codeInsight.controlflow.ControlFlowCache;
import com.jetbrains.python.codeInsight.controlflow.ReadWriteInstruction;
import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.PyAugAssignmentStatementNavigator;
-import com.intellij.psi.util.QualifiedName;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -112,7 +111,7 @@ public class PyDefUseUtil {
final Instruction[] instructions = controlFlow.getInstructions();
final int instr = ControlFlowUtil.findInstructionNumberByElement(instructions, anchor);
if (instr < 0) {
- return new PyElement[0];
+ return PyElement.EMPTY_ARRAY;
}
final boolean[] visited = new boolean[instructions.length];
final Collection result = Sets.newHashSet();
diff --git a/python/src/com/jetbrains/python/sdk/PythonSdkUpdater.java b/python/src/com/jetbrains/python/sdk/PythonSdkUpdater.java
index e593af40baa9..edca9e70620f 100644
--- a/python/src/com/jetbrains/python/sdk/PythonSdkUpdater.java
+++ b/python/src/com/jetbrains/python/sdk/PythonSdkUpdater.java
@@ -133,6 +133,7 @@ public class PythonSdkUpdater implements StartupActivity {
return true;
}
+ @SuppressWarnings("ThrowableInstanceNeverThrown") final Throwable methodCallStacktrace = new Throwable();
application.invokeLater(() -> {
synchronized (ourLock) {
if (!ourScheduledToRefresh.contains(homePath)) {
@@ -165,6 +166,7 @@ public class PythonSdkUpdater implements StartupActivity {
PyPackageManager.getInstance(sdk12).refreshAndGetPackages(true);
}
catch (ExecutionException e) {
+ e.initCause(methodCallStacktrace);
LOG.warn(e);
}
}
diff --git a/python/testData/inspections/PyCompatibilityInspection/bz2Module.py b/python/testData/inspections/PyCompatibilityInspection/bz2Module.py
new file mode 100644
index 000000000000..b4e4ac25b00a
--- /dev/null
+++ b/python/testData/inspections/PyCompatibilityInspection/bz2Module.py
@@ -0,0 +1 @@
+from bz2 import BZ2File
\ No newline at end of file
diff --git a/python/testData/inspections/PyCompatibilityInspection/underscoreBz2Module.py b/python/testData/inspections/PyCompatibilityInspection/underscoreBz2Module.py
new file mode 100644
index 000000000000..8ae8a0c2ad87
--- /dev/null
+++ b/python/testData/inspections/PyCompatibilityInspection/underscoreBz2Module.py
@@ -0,0 +1 @@
+import _bz2
\ No newline at end of file
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/dunderClass.py b/python/testData/inspections/PyUnresolvedReferencesInspection/dunderClass.py
new file mode 100644
index 000000000000..293405bd59bd
--- /dev/null
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection/dunderClass.py
@@ -0,0 +1,3 @@
+class A:
+ def foo(self):
+ return __class__
\ No newline at end of file
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection3K/dunderClass.py b/python/testData/inspections/PyUnresolvedReferencesInspection3K/dunderClass.py
new file mode 100644
index 000000000000..82edcc21ab81
--- /dev/null
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection3K/dunderClass.py
@@ -0,0 +1,3 @@
+class A:
+ def foo(self):
+ return __class__
\ No newline at end of file
diff --git a/python/testData/quickFixes/AddImportQuickFixTest/canonicalNamesFromHigherLevelPackage/bar/__init__.py b/python/testData/quickFixes/AddImportQuickFixTest/canonicalNamesFromHigherLevelPackage/bar/__init__.py
new file mode 100644
index 000000000000..3fdf6be7ca9b
--- /dev/null
+++ b/python/testData/quickFixes/AddImportQuickFixTest/canonicalNamesFromHigherLevelPackage/bar/__init__.py
@@ -0,0 +1 @@
+from mod import MyClass
\ No newline at end of file
diff --git a/python/testData/quickFixes/AddImportQuickFixTest/canonicalNamesFromHigherLevelPackage/bar/mod.py b/python/testData/quickFixes/AddImportQuickFixTest/canonicalNamesFromHigherLevelPackage/bar/mod.py
new file mode 100644
index 000000000000..6f75e663c7a6
--- /dev/null
+++ b/python/testData/quickFixes/AddImportQuickFixTest/canonicalNamesFromHigherLevelPackage/bar/mod.py
@@ -0,0 +1,2 @@
+class MyClass(object):
+ pass
\ No newline at end of file
diff --git a/python/testData/quickFixes/AddImportQuickFixTest/canonicalNamesFromHigherLevelPackage/foo/__init__.py b/python/testData/quickFixes/AddImportQuickFixTest/canonicalNamesFromHigherLevelPackage/foo/__init__.py
new file mode 100644
index 000000000000..3fdf6be7ca9b
--- /dev/null
+++ b/python/testData/quickFixes/AddImportQuickFixTest/canonicalNamesFromHigherLevelPackage/foo/__init__.py
@@ -0,0 +1 @@
+from mod import MyClass
\ No newline at end of file
diff --git a/python/testData/quickFixes/AddImportQuickFixTest/canonicalNamesFromHigherLevelPackage/foo/mod.py b/python/testData/quickFixes/AddImportQuickFixTest/canonicalNamesFromHigherLevelPackage/foo/mod.py
new file mode 100644
index 000000000000..6f75e663c7a6
--- /dev/null
+++ b/python/testData/quickFixes/AddImportQuickFixTest/canonicalNamesFromHigherLevelPackage/foo/mod.py
@@ -0,0 +1,2 @@
+class MyClass(object):
+ pass
\ No newline at end of file
diff --git a/python/testData/quickFixes/AddImportQuickFixTest/canonicalNamesFromHigherLevelPackage/main.py b/python/testData/quickFixes/AddImportQuickFixTest/canonicalNamesFromHigherLevelPackage/main.py
new file mode 100644
index 000000000000..3d0c10c7fceb
--- /dev/null
+++ b/python/testData/quickFixes/AddImportQuickFixTest/canonicalNamesFromHigherLevelPackage/main.py
@@ -0,0 +1 @@
+MyClass()
\ No newline at end of file
diff --git a/python/testData/quickFixes/AddImportQuickFixTest/canonicalNamesFromHigherLevelPackage/main_after.py b/python/testData/quickFixes/AddImportQuickFixTest/canonicalNamesFromHigherLevelPackage/main_after.py
new file mode 100644
index 000000000000..8683c5a7c50e
--- /dev/null
+++ b/python/testData/quickFixes/AddImportQuickFixTest/canonicalNamesFromHigherLevelPackage/main_after.py
@@ -0,0 +1,3 @@
+from foo import MyClass
+
+MyClass()
\ No newline at end of file
diff --git a/python/testData/resolve/ClassAttrInDeclaration.py b/python/testData/resolve/ClassAttrInDeclaration.py
new file mode 100644
index 000000000000..bf5499858801
--- /dev/null
+++ b/python/testData/resolve/ClassAttrInDeclaration.py
@@ -0,0 +1,4 @@
+class A:
+ my_attr = 17
+ print(my_attr)
+# [
\ No newline at end of file
diff --git a/python/testData/resolve/ClassAttrInDeclarationNewStyleClass.py b/python/testData/resolve/ClassAttrInDeclarationNewStyleClass.py
new file mode 100644
index 000000000000..fb3c9705a2bd
--- /dev/null
+++ b/python/testData/resolve/ClassAttrInDeclarationNewStyleClass.py
@@ -0,0 +1,4 @@
+class A(object):
+ my_attr = 17
+ print(my_attr)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/DunderClassInDeclaration.py b/python/testData/resolve/DunderClassInDeclaration.py
new file mode 100644
index 000000000000..d5bcc9eb2794
--- /dev/null
+++ b/python/testData/resolve/DunderClassInDeclaration.py
@@ -0,0 +1,3 @@
+class A:
+ print(__class__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/DunderClassInDeclarationInsideFunction.py b/python/testData/resolve/DunderClassInDeclarationInsideFunction.py
new file mode 100644
index 000000000000..5a67313028ea
--- /dev/null
+++ b/python/testData/resolve/DunderClassInDeclarationInsideFunction.py
@@ -0,0 +1,6 @@
+def foo():
+ class A:
+ print(__class__)
+ # ][
+
+ return A()
\ No newline at end of file
diff --git a/python/testData/resolve/DunderClassInDeclarationNewStyleClass.py b/python/testData/resolve/DunderClassInDeclarationNewStyleClass.py
new file mode 100644
index 000000000000..317370258e67
--- /dev/null
+++ b/python/testData/resolve/DunderClassInDeclarationNewStyleClass.py
@@ -0,0 +1,3 @@
+class A(object):
+ print(__class__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/DunderClassInDeclarationWithClassAttr.py b/python/testData/resolve/DunderClassInDeclarationWithClassAttr.py
new file mode 100644
index 000000000000..9e790d60290f
--- /dev/null
+++ b/python/testData/resolve/DunderClassInDeclarationWithClassAttr.py
@@ -0,0 +1,4 @@
+class A:
+ __class__ = 17
+ print(__class__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/DunderClassInDeclarationWithClassAttrNewStyleClass.py b/python/testData/resolve/DunderClassInDeclarationWithClassAttrNewStyleClass.py
new file mode 100644
index 000000000000..1921ecd845da
--- /dev/null
+++ b/python/testData/resolve/DunderClassInDeclarationWithClassAttrNewStyleClass.py
@@ -0,0 +1,4 @@
+class A(object):
+ __class__ = 17
+ print(__class__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/DunderClassInDeclarationWithInheritedClassAttr.py b/python/testData/resolve/DunderClassInDeclarationWithInheritedClassAttr.py
new file mode 100644
index 000000000000..cb3986d46517
--- /dev/null
+++ b/python/testData/resolve/DunderClassInDeclarationWithInheritedClassAttr.py
@@ -0,0 +1,6 @@
+class A(object):
+ __class__ = 17
+
+class B(A):
+ print(__class__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/DunderDocInDeclaration.py b/python/testData/resolve/DunderDocInDeclaration.py
new file mode 100644
index 000000000000..f542971e0ce5
--- /dev/null
+++ b/python/testData/resolve/DunderDocInDeclaration.py
@@ -0,0 +1,3 @@
+class A:
+ print(__doc__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/DunderDocInDeclarationNewStyleClass.py b/python/testData/resolve/DunderDocInDeclarationNewStyleClass.py
new file mode 100644
index 000000000000..8deaa6098586
--- /dev/null
+++ b/python/testData/resolve/DunderDocInDeclarationNewStyleClass.py
@@ -0,0 +1,3 @@
+class A(object):
+ print(__doc__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/DunderDocInDeclarationWithClassAttr.py b/python/testData/resolve/DunderDocInDeclarationWithClassAttr.py
new file mode 100644
index 000000000000..3e195cbb44ad
--- /dev/null
+++ b/python/testData/resolve/DunderDocInDeclarationWithClassAttr.py
@@ -0,0 +1,4 @@
+class A:
+ __doc__ = 17
+ print(__doc__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/DunderDocInDeclarationWithClassAttrNewStyleClass.py b/python/testData/resolve/DunderDocInDeclarationWithClassAttrNewStyleClass.py
new file mode 100644
index 000000000000..6a0dc30bd74f
--- /dev/null
+++ b/python/testData/resolve/DunderDocInDeclarationWithClassAttrNewStyleClass.py
@@ -0,0 +1,4 @@
+class A(object):
+ __doc__ = 17
+ print(__doc__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/DunderDocInDeclarationWithInheritedClassAttr.py b/python/testData/resolve/DunderDocInDeclarationWithInheritedClassAttr.py
new file mode 100644
index 000000000000..82af27afa69b
--- /dev/null
+++ b/python/testData/resolve/DunderDocInDeclarationWithInheritedClassAttr.py
@@ -0,0 +1,6 @@
+class A(object):
+ __doc__ = 17
+
+class B(A):
+ print(__doc__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/DunderSizeOfInDeclaration.py b/python/testData/resolve/DunderSizeOfInDeclaration.py
new file mode 100644
index 000000000000..f15a8686048d
--- /dev/null
+++ b/python/testData/resolve/DunderSizeOfInDeclaration.py
@@ -0,0 +1,3 @@
+class A:
+ print(__sizeof__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/DunderSizeOfInDeclarationNewStyleClass.py b/python/testData/resolve/DunderSizeOfInDeclarationNewStyleClass.py
new file mode 100644
index 000000000000..52caeda412ac
--- /dev/null
+++ b/python/testData/resolve/DunderSizeOfInDeclarationNewStyleClass.py
@@ -0,0 +1,3 @@
+class A(object):
+ print(__sizeof__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/DunderSizeOfInDeclarationWithClassAttr.py b/python/testData/resolve/DunderSizeOfInDeclarationWithClassAttr.py
new file mode 100644
index 000000000000..9aa973e5cd79
--- /dev/null
+++ b/python/testData/resolve/DunderSizeOfInDeclarationWithClassAttr.py
@@ -0,0 +1,4 @@
+class A:
+ __sizeof__ = 17
+ print(__sizeof__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/DunderSizeOfInDeclarationWithClassAttrNewStyleClass.py b/python/testData/resolve/DunderSizeOfInDeclarationWithClassAttrNewStyleClass.py
new file mode 100644
index 000000000000..5daf08022681
--- /dev/null
+++ b/python/testData/resolve/DunderSizeOfInDeclarationWithClassAttrNewStyleClass.py
@@ -0,0 +1,4 @@
+class A(object):
+ __sizeof__ = 17
+ print(__sizeof__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/DunderSizeOfInDeclarationWithInheritedClassAttr.py b/python/testData/resolve/DunderSizeOfInDeclarationWithInheritedClassAttr.py
new file mode 100644
index 000000000000..4d8a27e1cb0a
--- /dev/null
+++ b/python/testData/resolve/DunderSizeOfInDeclarationWithInheritedClassAttr.py
@@ -0,0 +1,6 @@
+class A(object):
+ __sizeof__ = 17
+
+class B(A):
+ print(__sizeof__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/ImplicitClassAttr.py b/python/testData/resolve/ImplicitClassAttr.py
new file mode 100644
index 000000000000..2d8a3eff40c1
--- /dev/null
+++ b/python/testData/resolve/ImplicitClassAttr.py
@@ -0,0 +1,6 @@
+class A:
+ my_attr = 15
+
+ def foo(self):
+ return my_attr
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/ImplicitClassAttrNewStyleClass.py b/python/testData/resolve/ImplicitClassAttrNewStyleClass.py
new file mode 100644
index 000000000000..070be0694552
--- /dev/null
+++ b/python/testData/resolve/ImplicitClassAttrNewStyleClass.py
@@ -0,0 +1,6 @@
+class A(object):
+ my_attr = 15
+
+ def foo(self):
+ return my_attr
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/ImplicitDunderClass.py b/python/testData/resolve/ImplicitDunderClass.py
new file mode 100644
index 000000000000..2e68ba7b1f22
--- /dev/null
+++ b/python/testData/resolve/ImplicitDunderClass.py
@@ -0,0 +1,4 @@
+class A:
+ def foo(self):
+ return __class__
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/ImplicitDunderClassNewStyleClass.py b/python/testData/resolve/ImplicitDunderClassNewStyleClass.py
new file mode 100644
index 000000000000..99a8a16771b7
--- /dev/null
+++ b/python/testData/resolve/ImplicitDunderClassNewStyleClass.py
@@ -0,0 +1,4 @@
+class A(object):
+ def foo(self):
+ return __class__
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/ImplicitDunderClassWithClassAttr.py b/python/testData/resolve/ImplicitDunderClassWithClassAttr.py
new file mode 100644
index 000000000000..81a09107ec71
--- /dev/null
+++ b/python/testData/resolve/ImplicitDunderClassWithClassAttr.py
@@ -0,0 +1,6 @@
+class A:
+ __class__ = 15
+
+ def foo(self):
+ return __class__
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/ImplicitDunderClassWithClassAttrNewStyleClass.py b/python/testData/resolve/ImplicitDunderClassWithClassAttrNewStyleClass.py
new file mode 100644
index 000000000000..4e685fd46b6b
--- /dev/null
+++ b/python/testData/resolve/ImplicitDunderClassWithClassAttrNewStyleClass.py
@@ -0,0 +1,6 @@
+class A(object):
+ __class__ = 15
+
+ def foo(self):
+ return __class__
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/ImplicitDunderClassWithInheritedClassAttr.py b/python/testData/resolve/ImplicitDunderClassWithInheritedClassAttr.py
new file mode 100644
index 000000000000..57cb96bf7405
--- /dev/null
+++ b/python/testData/resolve/ImplicitDunderClassWithInheritedClassAttr.py
@@ -0,0 +1,7 @@
+class A(object):
+ __class__ = int
+
+class B(A):
+ def foo(self):
+ return __class__
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/ImplicitDunderDoc.py b/python/testData/resolve/ImplicitDunderDoc.py
new file mode 100644
index 000000000000..30d09c82fc71
--- /dev/null
+++ b/python/testData/resolve/ImplicitDunderDoc.py
@@ -0,0 +1,4 @@
+class A:
+ def foo(self):
+ return __doc__
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/ImplicitDunderDocNewStyleClass.py b/python/testData/resolve/ImplicitDunderDocNewStyleClass.py
new file mode 100644
index 000000000000..1a93f8ff38b7
--- /dev/null
+++ b/python/testData/resolve/ImplicitDunderDocNewStyleClass.py
@@ -0,0 +1,4 @@
+class A(object):
+ def foo(self):
+ return __doc__
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/ImplicitDunderDocWithClassAttr.py b/python/testData/resolve/ImplicitDunderDocWithClassAttr.py
new file mode 100644
index 000000000000..821ed805f054
--- /dev/null
+++ b/python/testData/resolve/ImplicitDunderDocWithClassAttr.py
@@ -0,0 +1,6 @@
+class A:
+ __doc__ = 15
+
+ def foo(self):
+ return __doc__
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/ImplicitDunderDocWithClassAttrNewStyleClass.py b/python/testData/resolve/ImplicitDunderDocWithClassAttrNewStyleClass.py
new file mode 100644
index 000000000000..545b55d94a2e
--- /dev/null
+++ b/python/testData/resolve/ImplicitDunderDocWithClassAttrNewStyleClass.py
@@ -0,0 +1,6 @@
+class A(object):
+ __doc__ = 15
+
+ def foo(self):
+ return __doc__
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/ImplicitDunderDocWithInheritedClassAttr.py b/python/testData/resolve/ImplicitDunderDocWithInheritedClassAttr.py
new file mode 100644
index 000000000000..71701270e7fe
--- /dev/null
+++ b/python/testData/resolve/ImplicitDunderDocWithInheritedClassAttr.py
@@ -0,0 +1,7 @@
+class A(object):
+ __doc__ = "abc"
+
+class B(A):
+ def foo(self):
+ return __doc__
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/ImplicitDunderSizeOf.py b/python/testData/resolve/ImplicitDunderSizeOf.py
new file mode 100644
index 000000000000..e53d68134d68
--- /dev/null
+++ b/python/testData/resolve/ImplicitDunderSizeOf.py
@@ -0,0 +1,4 @@
+class A:
+ def foo(self):
+ return __sizeof__
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/ImplicitDunderSizeOfNewStyleClass.py b/python/testData/resolve/ImplicitDunderSizeOfNewStyleClass.py
new file mode 100644
index 000000000000..c0400c03bf45
--- /dev/null
+++ b/python/testData/resolve/ImplicitDunderSizeOfNewStyleClass.py
@@ -0,0 +1,4 @@
+class A(object):
+ def foo(self):
+ return __sizeof__
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/ImplicitDunderSizeOfWithClassAttr.py b/python/testData/resolve/ImplicitDunderSizeOfWithClassAttr.py
new file mode 100644
index 000000000000..46fe0e7ccd6e
--- /dev/null
+++ b/python/testData/resolve/ImplicitDunderSizeOfWithClassAttr.py
@@ -0,0 +1,6 @@
+class A:
+ __sizeof__ = 15
+
+ def foo(self):
+ return __sizeof__
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/ImplicitDunderSizeOfWithClassAttrNewStyleClass.py b/python/testData/resolve/ImplicitDunderSizeOfWithClassAttrNewStyleClass.py
new file mode 100644
index 000000000000..3ed21284e59a
--- /dev/null
+++ b/python/testData/resolve/ImplicitDunderSizeOfWithClassAttrNewStyleClass.py
@@ -0,0 +1,6 @@
+class A(object):
+ __sizeof__ = 15
+
+ def foo(self):
+ return __sizeof__
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/ImplicitDunderSizeOfWithInheritedClassAttr.py b/python/testData/resolve/ImplicitDunderSizeOfWithInheritedClassAttr.py
new file mode 100644
index 000000000000..34e70e535cf8
--- /dev/null
+++ b/python/testData/resolve/ImplicitDunderSizeOfWithInheritedClassAttr.py
@@ -0,0 +1,7 @@
+class A(object):
+ __sizeof__ = 4
+
+class B(A):
+ def foo(self):
+ return __sizeof__
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/ImplicitInheritedClassAttr.py b/python/testData/resolve/ImplicitInheritedClassAttr.py
new file mode 100644
index 000000000000..2c72252ac833
--- /dev/null
+++ b/python/testData/resolve/ImplicitInheritedClassAttr.py
@@ -0,0 +1,7 @@
+class A(object):
+ my_attr = 4
+
+class B(A):
+ def foo(self):
+ return my_attr
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/ImplicitUndeclaredClassAttr.py b/python/testData/resolve/ImplicitUndeclaredClassAttr.py
new file mode 100644
index 000000000000..d1c52ff2b51d
--- /dev/null
+++ b/python/testData/resolve/ImplicitUndeclaredClassAttr.py
@@ -0,0 +1,4 @@
+class A:
+ def foo(self):
+ return my_attr
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/ImplicitUndeclaredClassAttrNewStyleClass.py b/python/testData/resolve/ImplicitUndeclaredClassAttrNewStyleClass.py
new file mode 100644
index 000000000000..557ef92b6202
--- /dev/null
+++ b/python/testData/resolve/ImplicitUndeclaredClassAttrNewStyleClass.py
@@ -0,0 +1,4 @@
+class A(object):
+ def foo(self):
+ return my_attr
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InheritedClassAttrInDeclaration.py b/python/testData/resolve/InheritedClassAttrInDeclaration.py
new file mode 100644
index 000000000000..2b40795270fd
--- /dev/null
+++ b/python/testData/resolve/InheritedClassAttrInDeclaration.py
@@ -0,0 +1,6 @@
+class A(object):
+ my_attr = 17
+
+class B(A):
+ print(my_attr)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InstanceClassAttr.py b/python/testData/resolve/InstanceClassAttr.py
new file mode 100644
index 000000000000..6cd541bb959f
--- /dev/null
+++ b/python/testData/resolve/InstanceClassAttr.py
@@ -0,0 +1,7 @@
+class A:
+ my_attr = 15
+
+
+a = A()
+print(a.my_attr)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InstanceClassAttrNewStyleClass.py b/python/testData/resolve/InstanceClassAttrNewStyleClass.py
new file mode 100644
index 000000000000..4dd67f501a87
--- /dev/null
+++ b/python/testData/resolve/InstanceClassAttrNewStyleClass.py
@@ -0,0 +1,7 @@
+class A(object):
+ my_attr = 15
+
+
+a = A()
+print(a.my_attr)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InstanceDunderClass.py b/python/testData/resolve/InstanceDunderClass.py
new file mode 100644
index 000000000000..3f671b0c854d
--- /dev/null
+++ b/python/testData/resolve/InstanceDunderClass.py
@@ -0,0 +1,7 @@
+class A:
+ pass
+
+
+a = A()
+print(a.__class__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InstanceDunderClassNewStyleClass.py b/python/testData/resolve/InstanceDunderClassNewStyleClass.py
new file mode 100644
index 000000000000..d64ab5e20ec1
--- /dev/null
+++ b/python/testData/resolve/InstanceDunderClassNewStyleClass.py
@@ -0,0 +1,7 @@
+class A(object):
+ pass
+
+
+a = A()
+print(a.__class__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InstanceDunderClassWithClassAttr.py b/python/testData/resolve/InstanceDunderClassWithClassAttr.py
new file mode 100644
index 000000000000..819e206ffab6
--- /dev/null
+++ b/python/testData/resolve/InstanceDunderClassWithClassAttr.py
@@ -0,0 +1,7 @@
+class A:
+ __class__ = 15
+
+
+a = A()
+print(a.__class__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InstanceDunderClassWithClassAttrNewStyleClass.py b/python/testData/resolve/InstanceDunderClassWithClassAttrNewStyleClass.py
new file mode 100644
index 000000000000..a51fafbcb2a0
--- /dev/null
+++ b/python/testData/resolve/InstanceDunderClassWithClassAttrNewStyleClass.py
@@ -0,0 +1,7 @@
+class A(object):
+ __class__ = 15
+
+
+a = A()
+print(a.__class__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InstanceDunderClassWithInheritedClassAttr.py b/python/testData/resolve/InstanceDunderClassWithInheritedClassAttr.py
new file mode 100644
index 000000000000..c685bbd9ce87
--- /dev/null
+++ b/python/testData/resolve/InstanceDunderClassWithInheritedClassAttr.py
@@ -0,0 +1,10 @@
+class A(object):
+ __class__ = 15
+
+class B(A):
+ pass
+
+
+b = B()
+print(b.__class__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InstanceDunderDoc.py b/python/testData/resolve/InstanceDunderDoc.py
new file mode 100644
index 000000000000..04da49b0da7e
--- /dev/null
+++ b/python/testData/resolve/InstanceDunderDoc.py
@@ -0,0 +1,7 @@
+class A:
+ pass
+
+
+a = A()
+print(a.__doc__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InstanceDunderDocNewStyleClass.py b/python/testData/resolve/InstanceDunderDocNewStyleClass.py
new file mode 100644
index 000000000000..7639c9ecb3a4
--- /dev/null
+++ b/python/testData/resolve/InstanceDunderDocNewStyleClass.py
@@ -0,0 +1,7 @@
+class A(object):
+ pass
+
+
+a = A()
+print(a.__doc__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InstanceDunderDocWithClassAttr.py b/python/testData/resolve/InstanceDunderDocWithClassAttr.py
new file mode 100644
index 000000000000..b83622ea787d
--- /dev/null
+++ b/python/testData/resolve/InstanceDunderDocWithClassAttr.py
@@ -0,0 +1,7 @@
+class A:
+ __doc__ = 15
+
+
+a = A()
+print(a.__doc__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InstanceDunderDocWithClassAttrNewStyleClass.py b/python/testData/resolve/InstanceDunderDocWithClassAttrNewStyleClass.py
new file mode 100644
index 000000000000..8e71d90f7687
--- /dev/null
+++ b/python/testData/resolve/InstanceDunderDocWithClassAttrNewStyleClass.py
@@ -0,0 +1,7 @@
+class A(object):
+ __doc__ = 15
+
+
+a = A()
+print(a.__doc__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InstanceDunderDocWithInheritedClassAttr.py b/python/testData/resolve/InstanceDunderDocWithInheritedClassAttr.py
new file mode 100644
index 000000000000..3fef6e9429dc
--- /dev/null
+++ b/python/testData/resolve/InstanceDunderDocWithInheritedClassAttr.py
@@ -0,0 +1,10 @@
+class A(object):
+ __doc__ = 16
+
+class B(A):
+ pass
+
+
+b = B()
+print(b.__doc__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InstanceDunderSizeOf.py b/python/testData/resolve/InstanceDunderSizeOf.py
new file mode 100644
index 000000000000..9a34e386d031
--- /dev/null
+++ b/python/testData/resolve/InstanceDunderSizeOf.py
@@ -0,0 +1,7 @@
+class A:
+ pass
+
+
+a = A()
+print(a.__sizeof__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InstanceDunderSizeOfNewStyleClass.py b/python/testData/resolve/InstanceDunderSizeOfNewStyleClass.py
new file mode 100644
index 000000000000..58611a25ba1f
--- /dev/null
+++ b/python/testData/resolve/InstanceDunderSizeOfNewStyleClass.py
@@ -0,0 +1,7 @@
+class A(object):
+ pass
+
+
+a = A()
+print(a.__sizeof__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InstanceDunderSizeOfWithClassAttr.py b/python/testData/resolve/InstanceDunderSizeOfWithClassAttr.py
new file mode 100644
index 000000000000..7352e5b9b00d
--- /dev/null
+++ b/python/testData/resolve/InstanceDunderSizeOfWithClassAttr.py
@@ -0,0 +1,7 @@
+class A:
+ __sizeof__ = 15
+
+
+a = A()
+print(a.__sizeof__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InstanceDunderSizeOfWithClassAttrNewStyleClass.py b/python/testData/resolve/InstanceDunderSizeOfWithClassAttrNewStyleClass.py
new file mode 100644
index 000000000000..3f89b2b1c9ba
--- /dev/null
+++ b/python/testData/resolve/InstanceDunderSizeOfWithClassAttrNewStyleClass.py
@@ -0,0 +1,7 @@
+class A(object):
+ __sizeof__ = 15
+
+
+a = A()
+print(a.__sizeof__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InstanceDunderSizeOfWithInheritedClassAttr.py b/python/testData/resolve/InstanceDunderSizeOfWithInheritedClassAttr.py
new file mode 100644
index 000000000000..2e79cdfbf9ea
--- /dev/null
+++ b/python/testData/resolve/InstanceDunderSizeOfWithInheritedClassAttr.py
@@ -0,0 +1,10 @@
+class A(object):
+ __sizeof__ = 17
+
+class B(A):
+ pass
+
+
+b = B()
+print(b.__sizeof__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InstanceInheritedClassAttr.py b/python/testData/resolve/InstanceInheritedClassAttr.py
new file mode 100644
index 000000000000..5620fe5d471d
--- /dev/null
+++ b/python/testData/resolve/InstanceInheritedClassAttr.py
@@ -0,0 +1,10 @@
+class A(object):
+ my_attr = 17
+
+class B(A):
+ pass
+
+
+b = B()
+print(b.my_attr)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InstanceUndeclaredClassAttr.py b/python/testData/resolve/InstanceUndeclaredClassAttr.py
new file mode 100644
index 000000000000..a2d386057902
--- /dev/null
+++ b/python/testData/resolve/InstanceUndeclaredClassAttr.py
@@ -0,0 +1,7 @@
+class A:
+ pass
+
+
+a = A()
+print(a.my_attr)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/InstanceUndeclaredClassAttrNewStyleClass.py b/python/testData/resolve/InstanceUndeclaredClassAttrNewStyleClass.py
new file mode 100644
index 000000000000..72dc3f781122
--- /dev/null
+++ b/python/testData/resolve/InstanceUndeclaredClassAttrNewStyleClass.py
@@ -0,0 +1,7 @@
+class A(object):
+ pass
+
+
+a = A()
+print(a.my_attr)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/LocalDunderClass.py b/python/testData/resolve/LocalDunderClass.py
new file mode 100644
index 000000000000..01f4adf4e65c
--- /dev/null
+++ b/python/testData/resolve/LocalDunderClass.py
@@ -0,0 +1,5 @@
+class A:
+ def foo(self):
+ __class__ = 16
+ return __class__
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/TypeClassAttr.py b/python/testData/resolve/TypeClassAttr.py
new file mode 100644
index 000000000000..b24b8608b08a
--- /dev/null
+++ b/python/testData/resolve/TypeClassAttr.py
@@ -0,0 +1,6 @@
+class A:
+ my_attr = 15
+
+
+print(A.my_attr)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/TypeClassAttrNewStyleClass.py b/python/testData/resolve/TypeClassAttrNewStyleClass.py
new file mode 100644
index 000000000000..5fef732aff6d
--- /dev/null
+++ b/python/testData/resolve/TypeClassAttrNewStyleClass.py
@@ -0,0 +1,6 @@
+class A(object):
+ my_attr = 15
+
+
+print(A.my_attr)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/TypeDunderClass.py b/python/testData/resolve/TypeDunderClass.py
new file mode 100644
index 000000000000..9dc04760f400
--- /dev/null
+++ b/python/testData/resolve/TypeDunderClass.py
@@ -0,0 +1,6 @@
+class A:
+ pass
+
+
+print(A.__class__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/TypeDunderClassNewStyleClass.py b/python/testData/resolve/TypeDunderClassNewStyleClass.py
new file mode 100644
index 000000000000..2793517a5778
--- /dev/null
+++ b/python/testData/resolve/TypeDunderClassNewStyleClass.py
@@ -0,0 +1,6 @@
+class A(object):
+ pass
+
+
+print(A.__class__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/TypeDunderClassWithClassAttr.py b/python/testData/resolve/TypeDunderClassWithClassAttr.py
new file mode 100644
index 000000000000..3696e7afca7d
--- /dev/null
+++ b/python/testData/resolve/TypeDunderClassWithClassAttr.py
@@ -0,0 +1,6 @@
+class A:
+ __class__ = 15
+
+
+print(A.__class__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/TypeDunderClassWithClassAttrNewStyleClass.py b/python/testData/resolve/TypeDunderClassWithClassAttrNewStyleClass.py
new file mode 100644
index 000000000000..402f7f3ee014
--- /dev/null
+++ b/python/testData/resolve/TypeDunderClassWithClassAttrNewStyleClass.py
@@ -0,0 +1,6 @@
+class A(object):
+ __class__ = 15
+
+
+print(A.__class__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/TypeDunderClassWithInheritedClassAttr.py b/python/testData/resolve/TypeDunderClassWithInheritedClassAttr.py
new file mode 100644
index 000000000000..907d30dddf17
--- /dev/null
+++ b/python/testData/resolve/TypeDunderClassWithInheritedClassAttr.py
@@ -0,0 +1,9 @@
+class A(object):
+ __class__ = 17
+
+class B(A):
+ pass
+
+
+print(B.__class__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/TypeDunderDoc.py b/python/testData/resolve/TypeDunderDoc.py
new file mode 100644
index 000000000000..64c531c8b0ed
--- /dev/null
+++ b/python/testData/resolve/TypeDunderDoc.py
@@ -0,0 +1,6 @@
+class A:
+ pass
+
+
+print(A.__doc__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/TypeDunderDocNewStyleClass.py b/python/testData/resolve/TypeDunderDocNewStyleClass.py
new file mode 100644
index 000000000000..2c71c76dbc5c
--- /dev/null
+++ b/python/testData/resolve/TypeDunderDocNewStyleClass.py
@@ -0,0 +1,6 @@
+class A(object):
+ pass
+
+
+print(A.__doc__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/TypeDunderDocWithClassAttr.py b/python/testData/resolve/TypeDunderDocWithClassAttr.py
new file mode 100644
index 000000000000..8440e5ded58e
--- /dev/null
+++ b/python/testData/resolve/TypeDunderDocWithClassAttr.py
@@ -0,0 +1,6 @@
+class A:
+ __doc__ = 16
+
+
+print(A.__doc__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/TypeDunderDocWithClassAttrNewStyleClass.py b/python/testData/resolve/TypeDunderDocWithClassAttrNewStyleClass.py
new file mode 100644
index 000000000000..a06a2e5e863a
--- /dev/null
+++ b/python/testData/resolve/TypeDunderDocWithClassAttrNewStyleClass.py
@@ -0,0 +1,6 @@
+class A(object):
+ __doc__ = 16
+
+
+print(A.__doc__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/TypeDunderDocWithInheritedClassAttr.py b/python/testData/resolve/TypeDunderDocWithInheritedClassAttr.py
new file mode 100644
index 000000000000..77211eb54174
--- /dev/null
+++ b/python/testData/resolve/TypeDunderDocWithInheritedClassAttr.py
@@ -0,0 +1,9 @@
+class A(object):
+ __doc__ = 17
+
+class B(A):
+ pass
+
+
+print(B.__doc__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/TypeDunderSizeOf.py b/python/testData/resolve/TypeDunderSizeOf.py
new file mode 100644
index 000000000000..a301afe2804c
--- /dev/null
+++ b/python/testData/resolve/TypeDunderSizeOf.py
@@ -0,0 +1,6 @@
+class A:
+ pass
+
+
+print(A.__sizeof__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/TypeDunderSizeOfNewStyleClass.py b/python/testData/resolve/TypeDunderSizeOfNewStyleClass.py
new file mode 100644
index 000000000000..711370afac64
--- /dev/null
+++ b/python/testData/resolve/TypeDunderSizeOfNewStyleClass.py
@@ -0,0 +1,6 @@
+class A(object):
+ pass
+
+
+print(A.__sizeof__)
+# ][
\ No newline at end of file
diff --git a/python/testData/resolve/TypeDunderSizeOfWithClassAttr.py b/python/testData/resolve/TypeDunderSizeOfWithClassAttr.py
new file mode 100644
index 000000000000..8c6ef22596fe
--- /dev/null
+++ b/python/testData/resolve/TypeDunderSizeOfWithClassAttr.py
@@ -0,0 +1,6 @@
+class A:
+ __sizeof__ = 16
+
+
+print(A.__sizeof__)
+# ]