mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-04-20 13:31:28 +07:00
IFT-291 Bundle Features Suggester to Java, Kotlin, Python and JavaScript
IJ-CR-14522 GitOrigin-RevId: 6512d5f061c8004fb3e4f7f3f1f404193f30e1f5
This commit is contained in:
committed by
intellij-monorepo-bot
parent
59a6de678d
commit
2986a16262
@@ -5,6 +5,7 @@
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/resources" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/testSrc" isTestSource="true" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
@@ -18,5 +19,6 @@
|
||||
<orderEntry type="module" module-name="intellij.platform.debugger" />
|
||||
<orderEntry type="module" module-name="intellij.platform.core.ui" />
|
||||
<orderEntry type="module" module-name="intellij.java.debugger.impl" />
|
||||
<orderEntry type="module" module-name="intellij.platform.testFramework" scope="TEST" />
|
||||
</component>
|
||||
</module>
|
||||
@@ -2,5 +2,6 @@
|
||||
<extensions defaultExtensionNs="training">
|
||||
<ift.language.extension language="JAVA" implementationClass="com.intellij.java.ift.JavaLangSupport"/>
|
||||
<ift.learning.course language="JAVA" implementationClass="com.intellij.java.ift.JavaLearningCourse"/>
|
||||
<ifs.languageSupport language="JAVA" implementationClass="com.intellij.java.ifs.JavaLanguageSupport"/>
|
||||
</extensions>
|
||||
</idea-plugin>
|
||||
|
||||
@@ -1,23 +1,10 @@
|
||||
package training.featuresSuggester.suggesters.lang
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package com.intellij.java.ifs
|
||||
|
||||
import com.intellij.psi.PsiClass
|
||||
import com.intellij.psi.PsiCodeBlock
|
||||
import com.intellij.psi.PsiDeclarationStatement
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiExpression
|
||||
import com.intellij.psi.PsiExpressionStatement
|
||||
import com.intellij.psi.PsiField
|
||||
import com.intellij.psi.PsiFile
|
||||
import com.intellij.psi.PsiForStatement
|
||||
import com.intellij.psi.PsiIdentifier
|
||||
import com.intellij.psi.PsiIfStatement
|
||||
import com.intellij.psi.PsiLiteralExpression
|
||||
import com.intellij.psi.PsiLocalVariable
|
||||
import com.intellij.psi.PsiMethod
|
||||
import com.intellij.psi.PsiStatement
|
||||
import com.intellij.psi.PsiWhileStatement
|
||||
import com.intellij.psi.*
|
||||
import com.intellij.psi.impl.source.PsiJavaFileImpl
|
||||
import com.intellij.psi.util.descendantsOfType
|
||||
import training.featuresSuggester.LanguageSupport
|
||||
import training.featuresSuggester.getParentByPredicate
|
||||
import training.featuresSuggester.getParentOfType
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.completionPopup
|
||||
package com.intellij.java.ifs
|
||||
|
||||
import training.featuresSuggester.FeatureSuggesterTest
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.chooseCompletionItem
|
||||
@@ -13,6 +13,10 @@ class CompletionPopupSuggesterTest : FeatureSuggesterTest() {
|
||||
override val testingCodeFileName = "JavaCodeExample.java"
|
||||
override val testingSuggesterId = "Completion"
|
||||
|
||||
override fun getTestDataPath(): String {
|
||||
return "${homePath.removeSuffix("/community")}/community/java/java-features-trainer/testData"
|
||||
}
|
||||
|
||||
fun `testDelete and type dot, complete method call and get suggestion`() {
|
||||
with(myFixture) {
|
||||
moveCaretToLogicalPosition(12, 20)
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.copyPaste
|
||||
package com.intellij.java.ifs
|
||||
|
||||
import junit.framework.TestCase
|
||||
import training.featuresSuggester.FeatureSuggesterTest
|
||||
@@ -11,6 +11,10 @@ class CopyPasteSuggesterTest : FeatureSuggesterTest() {
|
||||
override val testingCodeFileName = "JavaCodeExample.java"
|
||||
override val testingSuggesterId = "Paste from history"
|
||||
|
||||
override fun getTestDataPath(): String {
|
||||
return "${homePath.removeSuffix("/community")}/community/java/java-features-trainer/testData"
|
||||
}
|
||||
|
||||
fun `testCopy text that contained in clipboard at first index and get suggestion`() {
|
||||
with(myFixture) {
|
||||
copyBetweenLogicalPositions(lineStartIndex = 5, columnStartIndex = 8, lineEndIndex = 5, columnEndIndex = 19)
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.fileStructure
|
||||
package com.intellij.java.ifs
|
||||
|
||||
import junit.framework.TestCase
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.focusEditor
|
||||
@@ -12,6 +12,10 @@ import training.featuresSuggester.NoSuggestion
|
||||
class FileStructureSuggesterJavaTest : FileStructureSuggesterTest() {
|
||||
override val testingCodeFileName = "JavaCodeExample.java"
|
||||
|
||||
override fun getTestDataPath(): String {
|
||||
return "${homePath.removeSuffix("/community")}/community/java/java-features-trainer/testData"
|
||||
}
|
||||
|
||||
override fun `testFind field and get suggestion`() {
|
||||
with(myFixture) {
|
||||
val fromOffset = logicalPositionToOffset(1, 0)
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.introduceVariable
|
||||
package com.intellij.java.ifs
|
||||
|
||||
import junit.framework.TestCase
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.copyCurrentSelection
|
||||
@@ -20,6 +20,10 @@ import training.featuresSuggester.NoSuggestion
|
||||
class IntroduceVariableSuggesterJavaTest : IntroduceVariableSuggesterTest() {
|
||||
override val testingCodeFileName = "JavaCodeExample.java"
|
||||
|
||||
override fun getTestDataPath(): String {
|
||||
return "${homePath.removeSuffix("/community")}/community/java/java-features-trainer/testData"
|
||||
}
|
||||
|
||||
override fun `testIntroduce expression from IF and get suggestion`() {
|
||||
with(myFixture) {
|
||||
cutBetweenLogicalPositions(lineStartIndex = 9, columnStartIndex = 23, lineEndIndex = 9, columnEndIndex = 38)
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.lineCommenting
|
||||
package com.intellij.java.ifs
|
||||
|
||||
import junit.framework.TestCase
|
||||
import training.featuresSuggester.FeatureSuggesterTest
|
||||
@@ -13,6 +13,10 @@ class LineCommentingSuggesterJavaTest : FeatureSuggesterTest() {
|
||||
override val testingCodeFileName = "JavaCodeExample.java"
|
||||
override val testingSuggesterId = "Comment with line comment"
|
||||
|
||||
override fun getTestDataPath(): String {
|
||||
return "${homePath.removeSuffix("/community")}/community/java/java-features-trainer/testData"
|
||||
}
|
||||
|
||||
fun `testComment 3 lines in a row and get suggestion`() {
|
||||
with(myFixture) {
|
||||
moveCaretToLogicalPosition(6, 8)
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.replaceCompletion
|
||||
package com.intellij.java.ifs
|
||||
|
||||
import junit.framework.TestCase
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.chooseCompletionItem
|
||||
@@ -15,6 +15,10 @@ import training.featuresSuggester.ReplaceCompletionSuggesterTest
|
||||
class ReplaceCompletionSuggesterJavaTest : ReplaceCompletionSuggesterTest() {
|
||||
override val testingCodeFileName = "JavaCodeExample.java"
|
||||
|
||||
override fun getTestDataPath(): String {
|
||||
return "${homePath.removeSuffix("/community")}/community/java/java-features-trainer/testData"
|
||||
}
|
||||
|
||||
override fun `testDelete and type dot, complete method call, remove previous identifier and get suggestion`() {
|
||||
with(myFixture) {
|
||||
moveCaretToLogicalPosition(12, 20)
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.surroundWith
|
||||
package com.intellij.java.ifs
|
||||
|
||||
import junit.framework.TestCase
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.insertNewLineAt
|
||||
@@ -13,6 +13,10 @@ import training.featuresSuggester.SurroundWithSuggesterTest
|
||||
class SurroundWithSuggesterJavaTest : SurroundWithSuggesterTest() {
|
||||
override val testingCodeFileName = "JavaCodeExample.java"
|
||||
|
||||
override fun getTestDataPath(): String {
|
||||
return "${homePath.removeSuffix("/community")}/community/java/java-features-trainer/testData"
|
||||
}
|
||||
|
||||
override fun `testSurround one statement with IF and get suggestion`() {
|
||||
with(myFixture) {
|
||||
insertNewLineAt(6)
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.unwrap
|
||||
package com.intellij.java.ifs
|
||||
|
||||
import junit.framework.TestCase
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.deleteSymbolAtCaret
|
||||
@@ -14,6 +14,10 @@ import training.featuresSuggester.UnwrapSuggesterTest
|
||||
class UnwrapSuggesterJavaTest : UnwrapSuggesterTest() {
|
||||
override val testingCodeFileName = "JavaCodeExample.java"
|
||||
|
||||
override fun getTestDataPath(): String {
|
||||
return "${homePath.removeSuffix("/community")}/community/java/java-features-trainer/testData"
|
||||
}
|
||||
|
||||
override fun `testUnwrap IF statement and get suggestion`() {
|
||||
with(myFixture) {
|
||||
moveCaretToLogicalPosition(11, 9)
|
||||
@@ -143,7 +143,7 @@
|
||||
<extensionPoint name="ifs.languageSupport"
|
||||
beanClass="com.intellij.lang.LanguageExtensionPoint"
|
||||
dynamic="true">
|
||||
<with attribute="implementationClass" implements="training.featuresSuggester.suggesters.lang.LanguageSupport"/>
|
||||
<with attribute="implementationClass" implements="training.featuresSuggester.LanguageSupport"/>
|
||||
</extensionPoint>
|
||||
</extensionPoints>
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
package training.featuresSuggester.suggesters.lang
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester
|
||||
|
||||
import com.intellij.lang.Language
|
||||
import com.intellij.lang.LanguageExtensionPoint
|
||||
@@ -46,11 +46,11 @@ internal fun handleAction(project: Project, action: Action) {
|
||||
}
|
||||
}
|
||||
|
||||
internal inline fun <reified T : PsiElement> PsiElement.getParentOfType(): T? {
|
||||
inline fun <reified T : PsiElement> PsiElement.getParentOfType(): T? {
|
||||
return PsiTreeUtil.getParentOfType(this, T::class.java)
|
||||
}
|
||||
|
||||
internal fun PsiElement.getParentByPredicate(predicate: (PsiElement) -> Boolean): PsiElement? {
|
||||
fun PsiElement.getParentByPredicate(predicate: (PsiElement) -> Boolean): PsiElement? {
|
||||
return parents(true).find(predicate)
|
||||
}
|
||||
|
||||
|
||||
@@ -4,9 +4,9 @@ import com.intellij.openapi.project.Project
|
||||
import com.intellij.psi.PsiFile
|
||||
import com.intellij.psi.PsiTreeChangeAdapter
|
||||
import com.intellij.psi.PsiTreeChangeEvent
|
||||
import training.featuresSuggester.LanguageSupport
|
||||
import training.featuresSuggester.actions.*
|
||||
import training.featuresSuggester.handleAction
|
||||
import training.featuresSuggester.suggesters.lang.LanguageSupport
|
||||
|
||||
class PsiActionsListener(private val project: Project) : PsiTreeChangeAdapter() {
|
||||
override fun beforePropertyChange(event: PsiTreeChangeEvent) {
|
||||
@@ -89,14 +89,7 @@ class PsiActionsListener(private val project: Project) : PsiTreeChangeAdapter()
|
||||
|
||||
override fun propertyChanged(event: PsiTreeChangeEvent) {
|
||||
if (event.parent == null || !isSourceFile(event.file)) return
|
||||
handleAction(
|
||||
project,
|
||||
PropertyChangedAction(
|
||||
psiFile = event.file!!,
|
||||
parent = event.parent,
|
||||
timeMillis = System.currentTimeMillis()
|
||||
)
|
||||
)
|
||||
handleAction(project, PropertyChangedAction(psiFile = event.file!!, parent = event.parent, timeMillis = System.currentTimeMillis()))
|
||||
}
|
||||
|
||||
override fun childRemoved(event: PsiTreeChangeEvent) {
|
||||
@@ -141,14 +134,7 @@ class PsiActionsListener(private val project: Project) : PsiTreeChangeAdapter()
|
||||
|
||||
override fun childrenChanged(event: PsiTreeChangeEvent) {
|
||||
if (event.parent == null || !isSourceFile(event.file)) return
|
||||
handleAction(
|
||||
project,
|
||||
ChildrenChangedAction(
|
||||
psiFile = event.file!!,
|
||||
parent = event.parent,
|
||||
timeMillis = System.currentTimeMillis()
|
||||
)
|
||||
)
|
||||
handleAction(project, ChildrenChangedAction(psiFile = event.file!!, parent = event.parent, timeMillis = System.currentTimeMillis()))
|
||||
}
|
||||
|
||||
override fun childMoved(event: PsiTreeChangeEvent) {
|
||||
|
||||
@@ -4,7 +4,6 @@ import com.intellij.psi.PsiComment
|
||||
import com.intellij.psi.PsiFile
|
||||
import training.featuresSuggester.*
|
||||
import training.featuresSuggester.actions.*
|
||||
import training.featuresSuggester.suggesters.lang.LanguageSupport
|
||||
|
||||
class CompletionPopupSuggester : AbstractFeatureSuggester() {
|
||||
override val id = "Completion"
|
||||
|
||||
@@ -7,12 +7,12 @@ import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiFile
|
||||
import com.intellij.psi.PsiNamedElement
|
||||
import training.featuresSuggester.FeatureSuggesterBundle
|
||||
import training.featuresSuggester.LanguageSupport
|
||||
import training.featuresSuggester.NoSuggestion
|
||||
import training.featuresSuggester.Suggestion
|
||||
import training.featuresSuggester.actions.Action
|
||||
import training.featuresSuggester.actions.EditorFindAction
|
||||
import training.featuresSuggester.actions.EditorFocusGainedAction
|
||||
import training.featuresSuggester.suggesters.lang.LanguageSupport
|
||||
|
||||
class FileStructureSuggester : AbstractFeatureSuggester() {
|
||||
override val id: String = "File structure"
|
||||
|
||||
@@ -2,12 +2,8 @@ package training.featuresSuggester.suggesters
|
||||
|
||||
import com.intellij.openapi.ide.CopyPasteManager
|
||||
import com.intellij.psi.PsiElement
|
||||
import training.featuresSuggester.FeatureSuggesterBundle
|
||||
import training.featuresSuggester.NoSuggestion
|
||||
import training.featuresSuggester.Suggestion
|
||||
import training.featuresSuggester.*
|
||||
import training.featuresSuggester.actions.*
|
||||
import training.featuresSuggester.asString
|
||||
import training.featuresSuggester.suggesters.lang.LanguageSupport
|
||||
import training.util.WeakReferenceDelegator
|
||||
import java.awt.datatransfer.DataFlavor
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@ import com.intellij.psi.PsiComment
|
||||
import com.intellij.refactoring.suggested.startOffset
|
||||
import training.featuresSuggester.*
|
||||
import training.featuresSuggester.actions.*
|
||||
import training.featuresSuggester.suggesters.lang.LanguageSupport
|
||||
|
||||
class ReplaceCompletionSuggester : AbstractFeatureSuggester() {
|
||||
override val id: String = "Completion with replace"
|
||||
|
||||
@@ -4,10 +4,10 @@ import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiFile
|
||||
import com.intellij.refactoring.suggested.startOffset
|
||||
import training.featuresSuggester.FeatureSuggesterBundle
|
||||
import training.featuresSuggester.LanguageSupport
|
||||
import training.featuresSuggester.NoSuggestion
|
||||
import training.featuresSuggester.Suggestion
|
||||
import training.featuresSuggester.actions.*
|
||||
import training.featuresSuggester.suggesters.lang.LanguageSupport
|
||||
import training.util.WeakReferenceDelegator
|
||||
|
||||
class SurroundWithSuggester : AbstractFeatureSuggester() {
|
||||
|
||||
@@ -3,13 +3,9 @@ package training.featuresSuggester.suggesters
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.refactoring.suggested.endOffset
|
||||
import com.intellij.refactoring.suggested.startOffset
|
||||
import training.featuresSuggester.FeatureSuggesterBundle
|
||||
import training.featuresSuggester.NoSuggestion
|
||||
import training.featuresSuggester.Suggestion
|
||||
import training.featuresSuggester.TextFragment
|
||||
import training.featuresSuggester.*
|
||||
import training.featuresSuggester.actions.Action
|
||||
import training.featuresSuggester.actions.BeforeEditorTextRemovedAction
|
||||
import training.featuresSuggester.suggesters.lang.LanguageSupport
|
||||
|
||||
class UnwrapSuggester : AbstractFeatureSuggester() {
|
||||
override val id: String = "Unwrap"
|
||||
|
||||
@@ -1,108 +0,0 @@
|
||||
package training.featuresSuggester.suggesters.lang
|
||||
|
||||
import com.intellij.lang.ecmascript6.psi.ES6Class
|
||||
import com.intellij.lang.javascript.psi.JSBlockStatement
|
||||
import com.intellij.lang.javascript.psi.JSExpression
|
||||
import com.intellij.lang.javascript.psi.JSExpressionStatement
|
||||
import com.intellij.lang.javascript.psi.JSForStatement
|
||||
import com.intellij.lang.javascript.psi.JSFunction
|
||||
import com.intellij.lang.javascript.psi.JSIfStatement
|
||||
import com.intellij.lang.javascript.psi.JSLiteralExpression
|
||||
import com.intellij.lang.javascript.psi.JSStatement
|
||||
import com.intellij.lang.javascript.psi.JSVarStatement
|
||||
import com.intellij.lang.javascript.psi.JSVariable
|
||||
import com.intellij.lang.javascript.psi.JSWhileStatement
|
||||
import com.intellij.lang.javascript.psi.impl.JSFileImpl
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiFile
|
||||
import com.intellij.psi.impl.source.tree.LeafPsiElement
|
||||
import com.intellij.psi.util.descendantsOfType
|
||||
import training.featuresSuggester.getParentByPredicate
|
||||
import training.featuresSuggester.getParentOfType
|
||||
|
||||
class JavaScriptLanguageSupport : LanguageSupport {
|
||||
override fun isSourceFile(file: PsiFile): Boolean {
|
||||
return file is JSFileImpl
|
||||
}
|
||||
|
||||
override fun isIfStatement(element: PsiElement): Boolean {
|
||||
return element is JSIfStatement
|
||||
}
|
||||
|
||||
override fun isForStatement(element: PsiElement): Boolean {
|
||||
return element is JSForStatement
|
||||
}
|
||||
|
||||
override fun isWhileStatement(element: PsiElement): Boolean {
|
||||
return element is JSWhileStatement
|
||||
}
|
||||
|
||||
override fun isCodeBlock(element: PsiElement): Boolean {
|
||||
return element is JSBlockStatement
|
||||
}
|
||||
|
||||
override fun getCodeBlock(element: PsiElement): PsiElement? {
|
||||
return element.descendantsOfType<JSBlockStatement>().firstOrNull()
|
||||
}
|
||||
|
||||
override fun getContainingCodeBlock(element: PsiElement): PsiElement? {
|
||||
return element.getParentOfType<JSBlockStatement>()
|
||||
}
|
||||
|
||||
override fun getParentStatementOfBlock(element: PsiElement): PsiElement? {
|
||||
return element.parent
|
||||
}
|
||||
|
||||
override fun getStatements(element: PsiElement): List<PsiElement> {
|
||||
return if (element is JSBlockStatement) {
|
||||
element.statementListItems.toList()
|
||||
}
|
||||
else {
|
||||
emptyList()
|
||||
}
|
||||
}
|
||||
|
||||
override fun getTopmostStatementWithText(psiElement: PsiElement, text: String): PsiElement? {
|
||||
return psiElement.getParentByPredicate {
|
||||
isSupportedStatementToIntroduceVariable(it) && it.text.contains(text) && it.text != text
|
||||
}
|
||||
}
|
||||
|
||||
override fun isSupportedStatementToIntroduceVariable(element: PsiElement): Boolean {
|
||||
return element is JSStatement
|
||||
}
|
||||
|
||||
override fun isPartOfExpression(element: PsiElement): Boolean {
|
||||
return element.getParentOfType<JSExpression>() != null
|
||||
}
|
||||
|
||||
override fun isExpressionStatement(element: PsiElement): Boolean {
|
||||
return element is JSExpressionStatement
|
||||
}
|
||||
|
||||
override fun isVariableDeclaration(element: PsiElement): Boolean {
|
||||
return element is JSVarStatement
|
||||
}
|
||||
|
||||
override fun getVariableName(element: PsiElement): String? {
|
||||
return if (element is JSVarStatement) {
|
||||
element.declarations.firstOrNull()?.name
|
||||
}
|
||||
else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
override fun isFileStructureElement(element: PsiElement): Boolean {
|
||||
return (element is JSVariable && element.getParentOfType<JSFunction>() == null) ||
|
||||
element is JSFunction || element is ES6Class
|
||||
}
|
||||
|
||||
override fun isIdentifier(element: PsiElement): Boolean {
|
||||
return element is LeafPsiElement && element.elementType.toString() == "JS:IDENTIFIER"
|
||||
}
|
||||
|
||||
override fun isLiteralExpression(element: PsiElement): Boolean {
|
||||
return element is JSLiteralExpression
|
||||
}
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
globalVar = 12342
|
||||
globalString = "123123" + "eee" + '11'
|
||||
|
||||
function globalFunction(arg1, arg2) {
|
||||
console.log(arg1 + arg2 - arg1 * arg1)
|
||||
}
|
||||
|
||||
class JavaScriptCodeExample {
|
||||
static field = 322
|
||||
abc = 3
|
||||
|
||||
constructor(abc) {
|
||||
this.abc = abc;
|
||||
}
|
||||
|
||||
main(args) {
|
||||
let anotherClass = new AnotherClass()
|
||||
var abc = 3
|
||||
const bcd = 5 * abc + JavaScriptCodeExample.field
|
||||
this.func(abc)
|
||||
if(abc < bcd && globalFunction(0, abc)) {
|
||||
console.log(abc * bcd - JavaScriptCodeExample.field)
|
||||
}
|
||||
let exampleClass = new JavaScriptCodeExample(322)
|
||||
exampleClass.main(null)
|
||||
}
|
||||
|
||||
func(arg) {
|
||||
return arg
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class AnotherClass {
|
||||
field = 322
|
||||
|
||||
main(args) {
|
||||
this.funct(this.funct(this.field * this.field))
|
||||
console.log(this.field * this.field)
|
||||
}
|
||||
|
||||
funct(arg) {
|
||||
return arg && this.field == 0
|
||||
}
|
||||
|
||||
cyclesFunction(ere) {
|
||||
let i = 10
|
||||
for(let j = 0; j < i; j++) {
|
||||
var res = j - j + j
|
||||
console.log(res - j)
|
||||
}
|
||||
i += 10
|
||||
while(i > 0) {
|
||||
console.log(i * i)
|
||||
i--
|
||||
}
|
||||
if(true) { i++ }
|
||||
return i
|
||||
}
|
||||
|
||||
stringFunction(sss) {
|
||||
let str = '2' + "123" + "rrr"
|
||||
str += '11111' + '323' + 2
|
||||
return str.toString() + "1231" + str + '11'
|
||||
}
|
||||
|
||||
selfReturningFunction(arg) {
|
||||
return this
|
||||
}
|
||||
|
||||
functionForReplaceCompletion() {
|
||||
let instance = new AnotherClass()
|
||||
let ss = instance.selfReturningFunction(322).selfReturningFunction(instance.cyclesFunction(0))
|
||||
.selfReturningFunction(1).field
|
||||
}
|
||||
}
|
||||
@@ -19,10 +19,6 @@ abstract class FeatureSuggesterTest : BasePlatformTestCase() {
|
||||
FeatureSuggesterTestUtils.subscribeToSuggestions(myFixture.project) { suggestion -> expectedSuggestion = suggestion }
|
||||
}
|
||||
|
||||
override fun getTestDataPath(): String {
|
||||
return "${homePath.removeSuffix("/community")}/community/plugins/ide-features-trainer/testData"
|
||||
}
|
||||
|
||||
fun assertSuggestedCorrectly() {
|
||||
TestCase.assertTrue(expectedSuggestion is PopupSuggestion)
|
||||
TestCase.assertEquals(testingSuggesterId, (expectedSuggestion as PopupSuggestion).suggesterId)
|
||||
|
||||
@@ -1,98 +0,0 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.fileStructure
|
||||
|
||||
import junit.framework.TestCase
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.focusEditor
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.logicalPositionToOffset
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.performFindInFileAction
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.testInvokeLater
|
||||
import training.featuresSuggester.FileStructureSuggesterTest
|
||||
import training.featuresSuggester.NoSuggestion
|
||||
|
||||
class FileStructureSuggesterJSTest : FileStructureSuggesterTest() {
|
||||
override val testingCodeFileName = "JavaScriptCodeExample.js"
|
||||
|
||||
override fun `testFind field and get suggestion`() {
|
||||
with(myFixture) {
|
||||
val fromOffset = logicalPositionToOffset(8, 0)
|
||||
performFindInFileAction("field", fromOffset)
|
||||
focusEditor()
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
assertSuggestedCorrectly()
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testFind method and get suggestion`() {
|
||||
with(myFixture) {
|
||||
val fromOffset = logicalPositionToOffset(4, 0)
|
||||
performFindInFileAction("mai", fromOffset)
|
||||
focusEditor()
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
assertSuggestedCorrectly()
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testFind function parameter and don't get suggestion`() {
|
||||
with(myFixture) {
|
||||
val fromOffset = logicalPositionToOffset(14, 0)
|
||||
performFindInFileAction("args", fromOffset)
|
||||
focusEditor()
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
TestCase.assertTrue(expectedSuggestion is NoSuggestion)
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testFind local variable declaration and don't get suggestion`() {
|
||||
with(myFixture) {
|
||||
val fromOffset = logicalPositionToOffset(14, 0)
|
||||
performFindInFileAction("abc", fromOffset)
|
||||
focusEditor()
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
TestCase.assertTrue(expectedSuggestion is NoSuggestion)
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testFind variable usage and don't get suggestion`() {
|
||||
with(myFixture) {
|
||||
val fromOffset = logicalPositionToOffset(18, 0)
|
||||
performFindInFileAction("abc", fromOffset)
|
||||
focusEditor()
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
TestCase.assertTrue(expectedSuggestion is NoSuggestion)
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testFind method usage and don't get suggestion`() {
|
||||
with(myFixture) {
|
||||
val fromOffset = logicalPositionToOffset(18, 0)
|
||||
performFindInFileAction("main", fromOffset)
|
||||
focusEditor()
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
TestCase.assertTrue(expectedSuggestion is NoSuggestion)
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testFind type usage and don't get suggestion`() {
|
||||
with(myFixture) {
|
||||
val fromOffset = logicalPositionToOffset(16, 25)
|
||||
performFindInFileAction("anotherCl", fromOffset)
|
||||
focusEditor()
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
TestCase.assertTrue(expectedSuggestion is NoSuggestion)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,140 +0,0 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.introduceVariable
|
||||
|
||||
import junit.framework.TestCase
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.copyCurrentSelection
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.cutBetweenLogicalPositions
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.deleteSymbolAtCaret
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.insertNewLineAt
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.moveCaretToLogicalPosition
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.pasteFromClipboard
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.selectBetweenLogicalPositions
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.testInvokeLater
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.typeAndCommit
|
||||
import training.featuresSuggester.IntroduceVariableSuggesterTest
|
||||
import training.featuresSuggester.NoSuggestion
|
||||
|
||||
class IntroduceVariableSuggesterJSTest : IntroduceVariableSuggesterTest() {
|
||||
override val testingCodeFileName = "JavaScriptCodeExample.js"
|
||||
|
||||
override fun `testIntroduce expression from IF and get suggestion`() {
|
||||
with(myFixture) {
|
||||
cutBetweenLogicalPositions(lineStartIndex = 20, columnStartIndex = 23, lineEndIndex = 20, columnEndIndex = 46)
|
||||
insertNewLineAt(20, 8)
|
||||
typeAndCommit("let flag =")
|
||||
pasteFromClipboard()
|
||||
moveCaretToLogicalPosition(21, 23)
|
||||
typeAndCommit(" flag")
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
assertSuggestedCorrectly()
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testIntroduce full expression from method call and get suggestion`() {
|
||||
with(myFixture) {
|
||||
cutBetweenLogicalPositions(lineStartIndex = 21, columnStartIndex = 24, lineEndIndex = 21, columnEndIndex = 63)
|
||||
insertNewLineAt(21, 12)
|
||||
typeAndCommit("var value = ")
|
||||
pasteFromClipboard()
|
||||
moveCaretToLogicalPosition(22, 24)
|
||||
typeAndCommit("value")
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
assertSuggestedCorrectly()
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testIntroduce part of expression from method call and get suggestion`() {
|
||||
with(myFixture) {
|
||||
cutBetweenLogicalPositions(lineStartIndex = 21, columnStartIndex = 33, lineEndIndex = 21, columnEndIndex = 24)
|
||||
insertNewLineAt(21, 12)
|
||||
typeAndCommit("let val = ")
|
||||
pasteFromClipboard()
|
||||
moveCaretToLogicalPosition(22, 24)
|
||||
typeAndCommit("val")
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
assertSuggestedCorrectly()
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testIntroduce part of string expression from method call and get suggestion`() {
|
||||
with(myFixture) {
|
||||
cutBetweenLogicalPositions(lineStartIndex = 62, columnStartIndex = 30, lineEndIndex = 62, columnEndIndex = 15)
|
||||
insertNewLineAt(62, 8)
|
||||
typeAndCommit("const tring = ")
|
||||
pasteFromClipboard()
|
||||
moveCaretToLogicalPosition(63, 15)
|
||||
typeAndCommit("tring")
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
assertSuggestedCorrectly()
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testIntroduce full expression from return statement and get suggestion`() {
|
||||
with(myFixture) {
|
||||
cutBetweenLogicalPositions(lineStartIndex = 63, columnStartIndex = 15, lineEndIndex = 63, columnEndIndex = 51)
|
||||
insertNewLineAt(63, 8)
|
||||
typeAndCommit("let bool= ")
|
||||
pasteFromClipboard()
|
||||
moveCaretToLogicalPosition(64, 15)
|
||||
typeAndCommit("bool")
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
assertSuggestedCorrectly()
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testIntroduce expression from method body using copy and backspace and get suggestion`() {
|
||||
with(myFixture) {
|
||||
selectBetweenLogicalPositions(
|
||||
lineStartIndex = 37,
|
||||
columnStartIndex = 30,
|
||||
lineEndIndex = 37,
|
||||
columnEndIndex = 40
|
||||
)
|
||||
copyCurrentSelection()
|
||||
selectBetweenLogicalPositions(
|
||||
lineStartIndex = 37,
|
||||
columnStartIndex = 30,
|
||||
lineEndIndex = 37,
|
||||
columnEndIndex = 40
|
||||
)
|
||||
deleteSymbolAtCaret()
|
||||
insertNewLineAt(37, 8)
|
||||
typeAndCommit("let output = ")
|
||||
pasteFromClipboard()
|
||||
moveCaretToLogicalPosition(38, 30)
|
||||
typeAndCommit("output")
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
assertSuggestedCorrectly()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This case must throw suggestion but not working now
|
||||
*/
|
||||
fun `testIntroduce part of string declaration expression and don't get suggestion`() {
|
||||
with(myFixture) {
|
||||
cutBetweenLogicalPositions(lineStartIndex = 61, columnStartIndex = 24, lineEndIndex = 61, columnEndIndex = 37)
|
||||
insertNewLineAt(61, 8)
|
||||
typeAndCommit("let trrr = ")
|
||||
pasteFromClipboard()
|
||||
moveCaretToLogicalPosition(62, 24)
|
||||
typeAndCommit("trrr")
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
TestCase.assertTrue(expectedSuggestion is NoSuggestion)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,126 +0,0 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.replaceCompletion
|
||||
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.chooseCompletionItem
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.deleteTextBetweenLogicalPositions
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.invokeCodeCompletion
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.moveCaretToLogicalPosition
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.testInvokeLater
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.typeAndCommit
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.typeDelete
|
||||
import training.featuresSuggester.NoSuggestion
|
||||
import training.featuresSuggester.ReplaceCompletionSuggesterTest
|
||||
|
||||
class ReplaceCompletionSuggesterJSTest : ReplaceCompletionSuggesterTest() {
|
||||
override val testingCodeFileName = "JavaScriptCodeExample.js"
|
||||
|
||||
override fun `testDelete and type dot, complete method call, remove previous identifier and get suggestion`() {
|
||||
with(myFixture) {
|
||||
moveCaretToLogicalPosition(24, 21)
|
||||
deleteAndTypeDot()
|
||||
val variants = invokeCodeCompletion() ?: error("Not found lookup elements")
|
||||
chooseCompletionItem(variants[1])
|
||||
repeat(5) { typeDelete() }
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
assertSuggestedCorrectly()
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testCall completion, complete method call, remove previous identifier and get suggestion`() {
|
||||
with(myFixture) {
|
||||
moveCaretToLogicalPosition(72, 53)
|
||||
val variants = invokeCodeCompletion() ?: error("Not found lookup elements")
|
||||
chooseCompletionItem(variants[0])
|
||||
deleteTextBetweenLogicalPositions(
|
||||
lineStartIndex = 72,
|
||||
columnStartIndex = 68,
|
||||
lineEndIndex = 72,
|
||||
columnEndIndex = 90
|
||||
)
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
assertSuggestedCorrectly()
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testCall completion, complete with method call, add parameter to method call, remove previous identifier and get suggestion`() {
|
||||
with(myFixture) {
|
||||
moveCaretToLogicalPosition(72, 53)
|
||||
val variants = invokeCodeCompletion() ?: error("Not found lookup elements")
|
||||
chooseCompletionItem(variants[0])
|
||||
typeAndCommit("123")
|
||||
deleteTextBetweenLogicalPositions(
|
||||
lineStartIndex = 72,
|
||||
columnStartIndex = 72,
|
||||
lineEndIndex = 72,
|
||||
columnEndIndex = 93
|
||||
)
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
assertSuggestedCorrectly()
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testCall completion, complete with property, remove previous identifier and get suggestion`() {
|
||||
with(myFixture) {
|
||||
moveCaretToLogicalPosition(72, 26)
|
||||
val variants = invokeCodeCompletion() ?: error("Not found lookup elements")
|
||||
chooseCompletionItem(variants[1])
|
||||
repeat(21) { typeDelete() }
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
assertSuggestedCorrectly()
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testCall completion inside arguments list, complete method call, remove previous identifier and get suggestion`() {
|
||||
with(myFixture) {
|
||||
moveCaretToLogicalPosition(72, 84)
|
||||
val variants = invokeCodeCompletion() ?: error("Not found lookup elements")
|
||||
chooseCompletionItem(variants[0])
|
||||
repeat(15) { typeDelete() }
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
assertSuggestedCorrectly()
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testCall completion, type additional characters, complete, remove previous identifier and get suggestion`() {
|
||||
with(myFixture) {
|
||||
moveCaretToLogicalPosition(72, 26)
|
||||
invokeCodeCompletion()
|
||||
typeAndCommit("cycles")
|
||||
val variants = lookupElements ?: error("Not found lookup elements")
|
||||
chooseCompletionItem(variants[0])
|
||||
repeat(22) { typeDelete() }
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
assertSuggestedCorrectly()
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testCall completion, complete method call, remove another equal identifier and don't get suggestion`() {
|
||||
with(myFixture) {
|
||||
moveCaretToLogicalPosition(72, 53)
|
||||
val variants = invokeCodeCompletion() ?: error("Not found lookup elements")
|
||||
chooseCompletionItem(variants[0])
|
||||
deleteTextBetweenLogicalPositions(
|
||||
lineStartIndex = 73,
|
||||
columnStartIndex = 12,
|
||||
lineEndIndex = 73,
|
||||
columnEndIndex = 37
|
||||
)
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
assertTrue(expectedSuggestion is NoSuggestion)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,136 +0,0 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.unwrap
|
||||
|
||||
import junit.framework.TestCase
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.deleteSymbolAtCaret
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.insertNewLineAt
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.moveCaretToLogicalPosition
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.selectBetweenLogicalPositions
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.testInvokeLater
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.typeAndCommit
|
||||
import training.featuresSuggester.NoSuggestion
|
||||
import training.featuresSuggester.UnwrapSuggesterTest
|
||||
|
||||
class UnwrapSuggesterJSTest : UnwrapSuggesterTest() {
|
||||
override val testingCodeFileName: String = "JavaScriptCodeExample.js"
|
||||
|
||||
override fun `testUnwrap IF statement and get suggestion`() {
|
||||
with(myFixture) {
|
||||
moveCaretToLogicalPosition(22, 9)
|
||||
deleteSymbolAtCaret()
|
||||
selectBetweenLogicalPositions(lineStartIndex = 20, columnStartIndex = 49, lineEndIndex = 20, columnEndIndex = 3)
|
||||
deleteSymbolAtCaret()
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
assertSuggestedCorrectly()
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testUnwrap one-line IF and get suggestion`() {
|
||||
with(myFixture) {
|
||||
selectBetweenLogicalPositions(
|
||||
lineStartIndex = 56,
|
||||
columnStartIndex = 18,
|
||||
lineEndIndex = 56,
|
||||
columnEndIndex = 8
|
||||
)
|
||||
deleteSymbolAtCaret()
|
||||
moveCaretToLogicalPosition(56, 14)
|
||||
deleteSymbolAtCaret()
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
assertSuggestedCorrectly()
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testUnwrap IF with deleting multiline selection and get suggestion`() {
|
||||
with(myFixture) {
|
||||
selectBetweenLogicalPositions(lineStartIndex = 19, columnStartIndex = 22, lineEndIndex = 21, columnEndIndex = 5)
|
||||
deleteSymbolAtCaret()
|
||||
moveCaretToLogicalPosition(20, 9)
|
||||
deleteSymbolAtCaret()
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
assertSuggestedCorrectly()
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testUnwrap FOR and get suggestion`() {
|
||||
with(myFixture) {
|
||||
selectBetweenLogicalPositions(lineStartIndex = 47, columnStartIndex = 36, lineEndIndex = 47, columnEndIndex = 8)
|
||||
deleteSymbolAtCaret()
|
||||
moveCaretToLogicalPosition(50, 9)
|
||||
deleteSymbolAtCaret()
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
assertSuggestedCorrectly()
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testUnwrap WHILE and get suggestion`() {
|
||||
with(myFixture) {
|
||||
selectBetweenLogicalPositions(lineStartIndex = 52, columnStartIndex = 22, lineEndIndex = 52, columnEndIndex = 0)
|
||||
deleteSymbolAtCaret()
|
||||
moveCaretToLogicalPosition(55, 9)
|
||||
deleteSymbolAtCaret()
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
assertSuggestedCorrectly()
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testUnwrap commented IF and don't get suggestion`() {
|
||||
with(myFixture) {
|
||||
insertNewLineAt(46, 8)
|
||||
typeAndCommit(
|
||||
"""//if(true) {
|
||||
|//i++; j--;
|
||||
|//}""".trimMargin()
|
||||
)
|
||||
|
||||
selectBetweenLogicalPositions(
|
||||
lineStartIndex = 46,
|
||||
columnStartIndex = 10,
|
||||
lineEndIndex = 46,
|
||||
columnEndIndex = 20
|
||||
)
|
||||
deleteSymbolAtCaret()
|
||||
moveCaretToLogicalPosition(48, 11)
|
||||
deleteSymbolAtCaret()
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
TestCase.assertTrue(expectedSuggestion is NoSuggestion)
|
||||
}
|
||||
}
|
||||
|
||||
override fun `testUnwrap IF written in string block and don't get suggestion`() {
|
||||
with(myFixture) {
|
||||
insertNewLineAt(46, 8)
|
||||
typeAndCommit(
|
||||
"""let string = "if(true) {
|
||||
|i++; j--;
|
||||
|}"""".trimMargin()
|
||||
)
|
||||
|
||||
selectBetweenLogicalPositions(
|
||||
lineStartIndex = 46,
|
||||
columnStartIndex = 22,
|
||||
lineEndIndex = 46,
|
||||
columnEndIndex = 32
|
||||
)
|
||||
deleteSymbolAtCaret()
|
||||
moveCaretToLogicalPosition(48, 14)
|
||||
deleteSymbolAtCaret()
|
||||
}
|
||||
|
||||
testInvokeLater(project) {
|
||||
TestCase.assertTrue(expectedSuggestion is NoSuggestion)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,12 +5,14 @@
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/resources" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/testSrc" isTestSource="true" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" name="kotlin-stdlib-jdk8" level="project" />
|
||||
<orderEntry type="module" module-name="intellij.featuresTrainer" />
|
||||
<orderEntry type="module" module-name="intellij.java.featuresTrainer" />
|
||||
<orderEntry type="module" module-name="intellij.java.psi" />
|
||||
<orderEntry type="module" module-name="intellij.platform.core" />
|
||||
<orderEntry type="module" module-name="intellij.platform.projectModel" />
|
||||
<orderEntry type="module" module-name="intellij.platform.editor" />
|
||||
@@ -19,5 +21,7 @@
|
||||
<orderEntry type="module" module-name="kotlin.core" />
|
||||
<orderEntry type="module" module-name="kotlin.formatter" />
|
||||
<orderEntry type="module" module-name="kotlin.jvm" />
|
||||
<orderEntry type="module" module-name="intellij.platform.testFramework" scope="TEST" />
|
||||
<orderEntry type="module" module-name="kotlin.plugin" scope="TEST" />
|
||||
</component>
|
||||
</module>
|
||||
@@ -6,5 +6,6 @@
|
||||
<extensions defaultExtensionNs="training">
|
||||
<ift.language.extension language="kotlin" implementationClass="org.jetbrains.kotlin.training.ift.KotlinLangSupport"/>
|
||||
<ift.learning.course language="kotlin" implementationClass="org.jetbrains.kotlin.training.ift.KotlinLearningCourse"/>
|
||||
<ifs.languageSupport language="kotlin" implementationClass="org.jetbrains.kotlin.training.ifs.KotlinLanguageSupport"/>
|
||||
</extensions>
|
||||
</idea-plugin>
|
||||
|
||||
@@ -1,24 +1,13 @@
|
||||
package training.featuresSuggester.suggesters.lang
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package org.jetbrains.kotlin.training.ifs
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiFile
|
||||
import com.intellij.psi.impl.source.tree.LeafPsiElement
|
||||
import com.intellij.psi.util.descendantsOfType
|
||||
import com.intellij.psi.util.parentsOfType
|
||||
import org.jetbrains.kotlin.psi.KtBlockExpression
|
||||
import org.jetbrains.kotlin.psi.KtCallExpression
|
||||
import org.jetbrains.kotlin.psi.KtClass
|
||||
import org.jetbrains.kotlin.psi.KtDotQualifiedExpression
|
||||
import org.jetbrains.kotlin.psi.KtExpression
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.psi.KtForExpression
|
||||
import org.jetbrains.kotlin.psi.KtIfExpression
|
||||
import org.jetbrains.kotlin.psi.KtNamedFunction
|
||||
import org.jetbrains.kotlin.psi.KtProperty
|
||||
import org.jetbrains.kotlin.psi.KtQualifiedExpression
|
||||
import org.jetbrains.kotlin.psi.KtReturnExpression
|
||||
import org.jetbrains.kotlin.psi.KtStringTemplateExpression
|
||||
import org.jetbrains.kotlin.psi.KtWhileExpression
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import training.featuresSuggester.LanguageSupport
|
||||
import training.featuresSuggester.getParentByPredicate
|
||||
import training.featuresSuggester.getParentOfType
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.fileStructure
|
||||
package org.jetbrains.kotlin.training.ifs
|
||||
|
||||
import junit.framework.TestCase
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.focusEditor
|
||||
@@ -12,6 +12,10 @@ import training.featuresSuggester.NoSuggestion
|
||||
class FileStructureSuggesterKotlinTest : FileStructureSuggesterTest() {
|
||||
override val testingCodeFileName = "KotlinCodeExample.kt"
|
||||
|
||||
override fun getTestDataPath(): String {
|
||||
return "${homePath.removeSuffix("/community")}/community/plugins/kotlin/features-trainer/testData"
|
||||
}
|
||||
|
||||
override fun `testFind field and get suggestion`() {
|
||||
with(myFixture) {
|
||||
val fromOffset = logicalPositionToOffset(1, 0)
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.introduceVariable
|
||||
package org.jetbrains.kotlin.training.ifs
|
||||
|
||||
import junit.framework.TestCase
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.copyCurrentSelection
|
||||
@@ -20,6 +20,10 @@ import training.featuresSuggester.NoSuggestion
|
||||
class IntroduceVariableSuggesterKotlinTest : IntroduceVariableSuggesterTest() {
|
||||
override val testingCodeFileName = "KotlinCodeExample.kt"
|
||||
|
||||
override fun getTestDataPath(): String {
|
||||
return "${homePath.removeSuffix("/community")}/community/plugins/kotlin/features-trainer/testData"
|
||||
}
|
||||
|
||||
override fun `testIntroduce expression from IF and get suggestion`() {
|
||||
with(myFixture) {
|
||||
cutBetweenLogicalPositions(lineStartIndex = 9, columnStartIndex = 24, lineEndIndex = 9, columnEndIndex = 39)
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.replaceCompletion
|
||||
package org.jetbrains.kotlin.training.ifs
|
||||
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.chooseCompletionItem
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.deleteTextBetweenLogicalPositions
|
||||
@@ -14,6 +14,10 @@ import training.featuresSuggester.ReplaceCompletionSuggesterTest
|
||||
class ReplaceCompletionSuggesterKotlinTest : ReplaceCompletionSuggesterTest() {
|
||||
override val testingCodeFileName = "KotlinCodeExample.kt"
|
||||
|
||||
override fun getTestDataPath(): String {
|
||||
return "${homePath.removeSuffix("/community")}/community/plugins/kotlin/features-trainer/testData"
|
||||
}
|
||||
|
||||
override fun `testDelete and type dot, complete method call, remove previous identifier and get suggestion`() {
|
||||
with(myFixture) {
|
||||
moveCaretToLogicalPosition(12, 20)
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.surroundWith
|
||||
package org.jetbrains.kotlin.training.ifs
|
||||
|
||||
import junit.framework.TestCase
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.insertNewLineAt
|
||||
@@ -12,6 +12,10 @@ import training.featuresSuggester.SurroundWithSuggesterTest
|
||||
class SurroundWithSuggesterKotlinTest : SurroundWithSuggesterTest() {
|
||||
override val testingCodeFileName = "KotlinCodeExample.kt"
|
||||
|
||||
override fun getTestDataPath(): String {
|
||||
return "${homePath.removeSuffix("/community")}/community/plugins/kotlin/features-trainer/testData"
|
||||
}
|
||||
|
||||
override fun `testSurround one statement with IF and get suggestion`() {
|
||||
with(myFixture) {
|
||||
insertNewLineAt(6)
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.unwrap
|
||||
package org.jetbrains.kotlin.training.ifs
|
||||
|
||||
import junit.framework.TestCase
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.deleteSymbolAtCaret
|
||||
@@ -15,6 +15,10 @@ import training.featuresSuggester.UnwrapSuggesterTest
|
||||
class UnwrapSuggesterKotlinTest : UnwrapSuggesterTest() {
|
||||
override val testingCodeFileName = "KotlinCodeExample.kt"
|
||||
|
||||
override fun getTestDataPath(): String {
|
||||
return "${homePath.removeSuffix("/community")}/community/plugins/kotlin/features-trainer/testData"
|
||||
}
|
||||
|
||||
override fun `testUnwrap IF statement and get suggestion`() {
|
||||
with(myFixture) {
|
||||
moveCaretToLogicalPosition(11, 9)
|
||||
@@ -5,6 +5,7 @@
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/resources" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/testSrc" isTestSource="true" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
@@ -19,5 +20,7 @@
|
||||
<orderEntry type="module" module-name="intellij.platform.execution.impl" />
|
||||
<orderEntry type="library" name="kotlinx-serialization-core" level="project" />
|
||||
<orderEntry type="library" name="kotlinx-serialization-json" level="project" />
|
||||
<orderEntry type="module" module-name="intellij.platform.testFramework" scope="TEST" />
|
||||
<orderEntry type="module" module-name="intellij.pycharm.community" scope="TEST" />
|
||||
</component>
|
||||
</module>
|
||||
@@ -3,5 +3,6 @@
|
||||
<extensions defaultExtensionNs="training">
|
||||
<ift.language.extension language="Python" implementationClass="com.jetbrains.python.ift.PythonLangSupport"/>
|
||||
<ift.learning.course language="Python" implementationClass="com.jetbrains.python.ift.PythonLearningCourse"/>
|
||||
<ifs.languageSupport language="Python" implementationClass="com.jetbrains.python.ifs.PythonLanguageSupport"/>
|
||||
</extensions>
|
||||
</idea-plugin>
|
||||
|
||||
@@ -1,22 +1,12 @@
|
||||
package training.featuresSuggester.suggesters.lang
|
||||
package com.jetbrains.python.ifs
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiFile
|
||||
import com.intellij.psi.impl.source.tree.LeafPsiElement
|
||||
import com.intellij.psi.util.descendantsOfType
|
||||
import com.jetbrains.python.psi.PyAssignmentStatement
|
||||
import com.jetbrains.python.psi.PyClass
|
||||
import com.jetbrains.python.psi.PyExpression
|
||||
import com.jetbrains.python.psi.PyExpressionStatement
|
||||
import com.jetbrains.python.psi.PyForStatement
|
||||
import com.jetbrains.python.psi.PyFunction
|
||||
import com.jetbrains.python.psi.PyIfStatement
|
||||
import com.jetbrains.python.psi.PyStatement
|
||||
import com.jetbrains.python.psi.PyStatementList
|
||||
import com.jetbrains.python.psi.PyStringLiteralExpression
|
||||
import com.jetbrains.python.psi.PyTargetExpression
|
||||
import com.jetbrains.python.psi.PyWhileStatement
|
||||
import com.jetbrains.python.psi.*
|
||||
import com.jetbrains.python.psi.impl.PyFileImpl
|
||||
import training.featuresSuggester.LanguageSupport
|
||||
import training.featuresSuggester.getParentByPredicate
|
||||
import training.featuresSuggester.getParentOfType
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.fileStructure
|
||||
package com.jetbrains.python.ifs
|
||||
|
||||
import junit.framework.TestCase
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.focusEditor
|
||||
@@ -12,6 +12,10 @@ import training.featuresSuggester.NoSuggestion
|
||||
class FileStructureSuggesterPythonTest : FileStructureSuggesterTest() {
|
||||
override val testingCodeFileName = "PythonCodeExample.py"
|
||||
|
||||
override fun getTestDataPath(): String {
|
||||
return "${homePath.removeSuffix("/community")}/community/python/python-features-trainer/testData"
|
||||
}
|
||||
|
||||
override fun `testFind field and get suggestion`() {
|
||||
with(myFixture) {
|
||||
val fromOffset = logicalPositionToOffset(16, 0)
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.introduceVariable
|
||||
package com.jetbrains.python.ifs
|
||||
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.copyCurrentSelection
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.cutBetweenLogicalPositions
|
||||
@@ -18,6 +18,10 @@ import training.featuresSuggester.IntroduceVariableSuggesterTest
|
||||
class IntroduceVariableSuggesterPythonTest : IntroduceVariableSuggesterTest() {
|
||||
override val testingCodeFileName = "PythonCodeExample.py"
|
||||
|
||||
override fun getTestDataPath(): String {
|
||||
return "${homePath.removeSuffix("/community")}/community/python/python-features-trainer/testData"
|
||||
}
|
||||
|
||||
override fun `testIntroduce expression from IF and get suggestion`() {
|
||||
with(myFixture) {
|
||||
cutBetweenLogicalPositions(lineStartIndex = 3, columnStartIndex = 2, lineEndIndex = 3, columnEndIndex = 12)
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.lineCommenting
|
||||
package com.jetbrains.python.ifs
|
||||
|
||||
import junit.framework.TestCase
|
||||
import training.featuresSuggester.FeatureSuggesterTest
|
||||
@@ -13,6 +13,10 @@ class LineCommentingSuggesterPythonTest : FeatureSuggesterTest() {
|
||||
override val testingCodeFileName = "PythonCodeExample.py"
|
||||
override val testingSuggesterId = "Comment with line comment"
|
||||
|
||||
override fun getTestDataPath(): String {
|
||||
return "${homePath.removeSuffix("/community")}/community/python/python-features-trainer/testData"
|
||||
}
|
||||
|
||||
fun `testComment 3 lines in a row and get suggestion`() {
|
||||
with(myFixture) {
|
||||
moveCaretToLogicalPosition(3, 0)
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package training.featuresSuggester.replaceCompletion
|
||||
package com.jetbrains.python.ifs
|
||||
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.chooseCompletionItem
|
||||
import training.featuresSuggester.FeatureSuggesterTestUtils.deleteTextBetweenLogicalPositions
|
||||
@@ -14,6 +14,10 @@ import training.featuresSuggester.ReplaceCompletionSuggesterTest
|
||||
class ReplaceCompletionSuggesterPythonTest : ReplaceCompletionSuggesterTest() {
|
||||
override val testingCodeFileName = "PythonCodeExample.py"
|
||||
|
||||
override fun getTestDataPath(): String {
|
||||
return "${homePath.removeSuffix("/community")}/community/python/python-features-trainer/testData"
|
||||
}
|
||||
|
||||
override fun `testDelete and type dot, complete method call, remove previous identifier and get suggestion`() {
|
||||
with(myFixture) {
|
||||
moveCaretToLogicalPosition(27, 13)
|
||||
Reference in New Issue
Block a user