From ce8a364f46a4124b190cef7a09b402c7ead22634 Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 15 Feb 2016 12:55:19 +0300 Subject: [PATCH 01/11] added test on LockFreeCopyOnWriteArrayList --- .../intellij/util/containers/ContainerUtilTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/platform/platform-tests/testSrc/com/intellij/util/containers/ContainerUtilTest.java b/platform/platform-tests/testSrc/com/intellij/util/containers/ContainerUtilTest.java index 172afcafe4aa..c314f14fa168 100644 --- a/platform/platform-tests/testSrc/com/intellij/util/containers/ContainerUtilTest.java +++ b/platform/platform-tests/testSrc/com/intellij/util/containers/ContainerUtilTest.java @@ -252,6 +252,16 @@ public class ContainerUtilTest extends TestCase { assertSame(EmptyIterator.getInstance(), iterator); } + public void testIdenticalItemsInLockFreeCOW() { + List list = ContainerUtil.createLockFreeCopyOnWriteList(Arrays.asList("a", "b")); + list.add("a"); + assertEquals(3, list.size()); + list.remove("a"); + assertEquals(2, list.size()); + list.remove("a"); + assertEquals(1, list.size()); + } + public void testLockFreeCOWIteratorRemove() { List seq = Arrays.asList("0", "1", "2", "3", "4"); LockFreeCopyOnWriteArrayList my = (LockFreeCopyOnWriteArrayList)ContainerUtil.createLockFreeCopyOnWriteList(seq); From 2166cd0886cd0e36e7054bacd513e6252b02c4e3 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Mon, 15 Feb 2016 13:43:26 +0300 Subject: [PATCH 02/11] avoid spurious project leak detection in tests, related to editor --- .../src/com/intellij/openapi/editor/impl/EditorImpl.java | 1 + .../openapi/editor/impl/EditorSizeAdjustmentStrategy.java | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index ee0653995ab5..bcbf56016ecd 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -883,6 +883,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi isReleased = true; clearSettingsCache(); + mySizeAdjustmentStrategy.cancelAllRequests(); myFoldingModel.dispose(); mySoftWrapModel.release(); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorSizeAdjustmentStrategy.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorSizeAdjustmentStrategy.java index 2a72d12a6002..82ab0aa7d2b4 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorSizeAdjustmentStrategy.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorSizeAdjustmentStrategy.java @@ -103,6 +103,10 @@ class EditorSizeAdjustmentStrategy { scheduleSizeUpdate(editor); return result; } + + void cancelAllRequests() { + myAlarm.cancelAllRequests(); + } /** * Removes old timings. From 0137d2fb9241966a91fc60be920a0e4a03ca830e Mon Sep 17 00:00:00 2001 From: Liana Bakradze Date: Mon, 15 Feb 2016 13:46:26 +0300 Subject: [PATCH 03/11] support for tasks and lessons as separate modules --- .../jetbrains/edu/learning/StudyUtils.java | 15 +++++++++++- .../actions/StudyTaskNavigationAction.java | 3 ++- .../StudyProjectGenerator.java | 6 ++--- .../projectView/StudyDirectoryNode.java | 24 +++++++++---------- 4 files changed, 30 insertions(+), 18 deletions(-) diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/StudyUtils.java b/python/educational-core/student/src/com/jetbrains/edu/learning/StudyUtils.java index a97e979f06f6..a1ed979c5309 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/StudyUtils.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/StudyUtils.java @@ -235,10 +235,17 @@ public class StudyUtils { if (course == null) { return null; } - final VirtualFile taskDir = file.getParent(); + VirtualFile taskDir = file.getParent(); if (taskDir == null) { return null; } + //need this because of multi-module generation + if ("src".equals(taskDir.getName())) { + taskDir = taskDir.getParent(); + if (taskDir == null) { + return null; + } + } final String taskDirName = taskDir.getName(); if (taskDirName.contains(EduNames.TASK)) { final VirtualFile lessonDir = taskDir.getParent(); @@ -392,6 +399,12 @@ public class StudyUtils { } if (taskDirectory != null) { VirtualFile taskTextFile = taskDirectory.findChild(EduNames.TASK_HTML); + if (taskTextFile == null) { + VirtualFile srcDir = taskDirectory.findChild("src"); + if (srcDir != null) { + taskTextFile = srcDir.findChild(EduNames.TASK_HTML); + } + } if (taskTextFile != null) { try { return FileUtil.loadTextAndClose(taskTextFile.getInputStream()); diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyTaskNavigationAction.java b/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyTaskNavigationAction.java index 54ede8fc64c7..b4e8d16905f0 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyTaskNavigationAction.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyTaskNavigationAction.java @@ -92,7 +92,8 @@ abstract public class StudyTaskNavigationAction extends DumbAwareAction { for (Map.Entry entry : nextTaskFiles.entrySet()) { String name = entry.getKey(); TaskFile taskFile = entry.getValue(); - VirtualFile vf = taskDir.findChild(name); + VirtualFile srcDir = taskDir.findChild("src"); + VirtualFile vf = srcDir == null ? taskDir.findChild(name) : srcDir.findChild(name); if (vf != null) { FileEditorManager.getInstance(project).openFile(vf, true); if (!taskFile.getAnswerPlaceholders().isEmpty()) { diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java b/python/educational-core/student/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java index 5d5c0f7b7799..dc0eb04cee57 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java @@ -46,10 +46,10 @@ import java.util.Map; public class StudyProjectGenerator { private static final Logger LOG = Logger.getInstance(StudyProjectGenerator.class.getName()); private final List myListeners = ContainerUtil.newArrayList(); - private static final File ourCoursesDir = new File(PathManager.getConfigPath(), "courses"); + protected static final File ourCoursesDir = new File(PathManager.getConfigPath(), "courses"); private static final String CACHE_NAME = "courseNames.txt"; private List myCourses = new ArrayList<>(); - private CourseInfo mySelectedCourseInfo; + protected CourseInfo mySelectedCourseInfo; private static final String COURSE_NAME_ATTRIBUTE = "name"; private static final String COURSE_DESCRIPTION = "description"; public static final String AUTHOR_ATTRIBUTE = "authors"; @@ -82,7 +82,7 @@ public class StudyProjectGenerator { }))); } - private Course getCourse() { + protected Course getCourse() { Reader reader = null; try { final File courseFile = new File(new File(ourCoursesDir, mySelectedCourseInfo.getName()), EduNames.COURSE_META_FILE); diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/projectView/StudyDirectoryNode.java b/python/educational-core/student/src/com/jetbrains/edu/learning/projectView/StudyDirectoryNode.java index 0a5e37c64709..92bb2dfad280 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/projectView/StudyDirectoryNode.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/projectView/StudyDirectoryNode.java @@ -41,7 +41,7 @@ public class StudyDirectoryNode extends PsiDirectoryNode { String valueName = myValue.getName(); StudyTaskManager studyTaskManager = StudyTaskManager.getInstance(myProject); Course course = studyTaskManager.getCourse(); - if (course == null || valueName == null) { + if (course == null) { return; } if (valueName.equals(myProject.getName())) { @@ -50,19 +50,17 @@ public class StudyDirectoryNode extends PsiDirectoryNode { data.addText(course.getName(), new SimpleTextAttributes(SimpleTextAttributes.STYLE_PLAIN, JBColor.BLACK)); } else if (valueName.contains(EduNames.TASK)) { - TaskFile file = null; - for (PsiElement child : myValue.getChildren()) { - VirtualFile virtualFile = child instanceof PsiDirectory ? ((PsiDirectory)child).getVirtualFile() : - child.getContainingFile().getVirtualFile(); - file = StudyUtils.getTaskFile(myProject, virtualFile); - if (file != null) { - break; + VirtualFile taskVirtualFile = myValue.getVirtualFile(); + VirtualFile lessonVirtualFile = taskVirtualFile.getParent(); + if (lessonVirtualFile != null) { + Lesson lesson = course.getLesson(lessonVirtualFile.getName()); + if (lesson != null) { + Task task = lesson.getTask(taskVirtualFile.getName()); + if (task != null) { + setStudyAttributes(task, data, task.getName()); + } } } - if (file != null) { - Task task = file.getTask(); - setStudyAttributes(task, data, task.getName()); - } } else if (valueName.contains(EduNames.LESSON)) { int lessonIndex = Integer.parseInt(valueName.substring(EduNames.LESSON.length())) - 1; @@ -73,7 +71,7 @@ public class StudyDirectoryNode extends PsiDirectoryNode { else if (valueName.contains(EduNames.SANDBOX_DIR)) { if (myValue.getParent() != null) { final String parentName = myValue.getParent().getName(); - if (parentName!= null && !parentName.contains(EduNames.SANDBOX_DIR)) { + if (!parentName.contains(EduNames.SANDBOX_DIR)) { data.setPresentableText(EduNames.SANDBOX_DIR); data.setIcon(InteractiveLearningIcons.Sandbox); } From 58a92fde16737eca402e5b0c6940e03ea297ec15 Mon Sep 17 00:00:00 2001 From: Semyon Proshev Date: Wed, 10 Feb 2016 12:31:21 +0300 Subject: [PATCH 04/11] PY-12396 Fixed: Property getter live template is useful only inside python class Separate Python liveTemplatesContext into two parts: General and Class --- python/resources/liveTemplates/Python.xml | 12 +- python/src/META-INF/python-core-common.xml | 6 +- .../PythonTemplateContextType.java | 58 ++++++++-- .../liveTemplates/context/afterDot.py | 1 + .../liveTemplates/context/class.py | 3 + .../liveTemplates/context/general.py | 2 + .../liveTemplates/context/inComment.py | 1 + .../liveTemplates/context/inParameterList.py | 2 + .../liveTemplates/context/inStringLiteral.py | 1 + .../liveTemplates/context/notPython.html | 3 + .../liveTemplates/PyLiveTemplatesTest.java | 104 ++++++++++++++++++ 11 files changed, 178 insertions(+), 15 deletions(-) create mode 100644 python/testData/codeInsight/liveTemplates/context/afterDot.py create mode 100644 python/testData/codeInsight/liveTemplates/context/class.py create mode 100644 python/testData/codeInsight/liveTemplates/context/general.py create mode 100644 python/testData/codeInsight/liveTemplates/context/inComment.py create mode 100644 python/testData/codeInsight/liveTemplates/context/inParameterList.py create mode 100644 python/testData/codeInsight/liveTemplates/context/inStringLiteral.py create mode 100644 python/testData/codeInsight/liveTemplates/context/notPython.html create mode 100644 python/testSrc/com/jetbrains/python/codeInsight/liveTemplates/PyLiveTemplatesTest.java diff --git a/python/resources/liveTemplates/Python.xml b/python/resources/liveTemplates/Python.xml index 47928f82d8aa..401598608729 100644 --- a/python/resources/liveTemplates/Python.xml +++ b/python/resources/liveTemplates/Python.xml @@ -8,7 +8,8 @@