From 6af6564dd841a54e5a13e8e99bc14043bcea68b5 Mon Sep 17 00:00:00 2001 From: adelf Date: Tue, 4 Aug 2020 19:13:50 +0300 Subject: [PATCH 1/4] this fields completion --- .../ThisFieldsCompletionContributor.kt | 73 +++++++++++++++++++ .../pest/completion/ThisFieldsIndex.kt | 61 ++++++++++++++++ .../thisField/beforeEachCompletion.php | 9 +++ 3 files changed, 143 insertions(+) create mode 100644 src/main/kotlin/com/pestphp/pest/completion/ThisFieldsCompletionContributor.kt create mode 100644 src/main/kotlin/com/pestphp/pest/completion/ThisFieldsIndex.kt create mode 100644 src/test/kotlin/com/pestphp/pest/tests/types/fixtures/thisField/beforeEachCompletion.php diff --git a/src/main/kotlin/com/pestphp/pest/completion/ThisFieldsCompletionContributor.kt b/src/main/kotlin/com/pestphp/pest/completion/ThisFieldsCompletionContributor.kt new file mode 100644 index 00000000..3aa9b3b2 --- /dev/null +++ b/src/main/kotlin/com/pestphp/pest/completion/ThisFieldsCompletionContributor.kt @@ -0,0 +1,73 @@ +package com.pestphp.pest.completion + +import com.intellij.codeInsight.completion.CompletionContributor +import com.intellij.codeInsight.completion.CompletionParameters +import com.intellij.codeInsight.completion.CompletionProvider +import com.intellij.codeInsight.completion.CompletionResultSet +import com.intellij.codeInsight.completion.CompletionType +import com.intellij.codeInsight.lookup.LookupElementBuilder +import com.intellij.codeInsight.navigation.actions.GotoDeclarationHandler +import com.intellij.openapi.editor.Editor +import com.intellij.patterns.PlatformPatterns +import com.intellij.psi.PsiElement +import com.intellij.psi.util.elementType +import com.intellij.util.ProcessingContext +import com.intellij.util.indexing.FileBasedIndex +import com.jetbrains.php.PhpIcons +import com.jetbrains.php.lang.lexer.PhpTokenTypes +import com.jetbrains.php.lang.psi.elements.FieldReference +import com.jetbrains.php.lang.psi.elements.Variable +import com.jetbrains.php.lang.psi.elements.impl.FunctionReferenceImpl +import com.pestphp.pest.getAllBeforeThisAssignments +import com.pestphp.pest.isPestAfterFunction +import com.pestphp.pest.isPestTestFunction +import com.pestphp.pest.isThisVariableInPest + +class ThisFieldsCompletionContributor : CompletionContributor(), GotoDeclarationHandler { + init { + extend( + CompletionType.BASIC, + PlatformPatterns.psiElement().withElementType(PhpTokenTypes.IDENTIFIER).withParent(FieldReference::class.java), + provider + ) + } + + override fun getGotoDeclarationTargets(sourceElement: PsiElement?, offset: Int, editor: Editor?): Array { + if (sourceElement?.elementType != PhpTokenTypes.IDENTIFIER) return PsiElement.EMPTY_ARRAY + + val fieldReference = sourceElement?.parent as? FieldReference ?: return PsiElement.EMPTY_ARRAY + + if (fieldReference.classReference?.isThisVariableInPest { check(it) } != true) return PsiElement.EMPTY_ARRAY + + return (fieldReference.containingFile ?: return PsiElement.EMPTY_ARRAY).getAllBeforeThisAssignments() + .filter { it.variable?.name == fieldReference.name } + .mapNotNull { it.variable } + .toTypedArray() + } + + companion object { + private val provider = Provider() + + private fun check(it: FunctionReferenceImpl) = it.isPestTestFunction() || it.isPestAfterFunction() + } + + private class Provider : CompletionProvider() { + override fun addCompletions(parameters: CompletionParameters, context: ProcessingContext, result: CompletionResultSet) { + val fieldReference = parameters.originalPosition?.parent as? FieldReference ?: return + + if ((fieldReference.classReference as? Variable)?.name != "this") return + + FileBasedIndex.getInstance().getFileData( + ThisFieldsIndex.KEY, + fieldReference.containingFile.virtualFile, + fieldReference.project + ) + .keys + .forEach { + result.addElement( + LookupElementBuilder.create(it).withIcon(PhpIcons.FIELD) + ) + } + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/pestphp/pest/completion/ThisFieldsIndex.kt b/src/main/kotlin/com/pestphp/pest/completion/ThisFieldsIndex.kt new file mode 100644 index 00000000..862df580 --- /dev/null +++ b/src/main/kotlin/com/pestphp/pest/completion/ThisFieldsIndex.kt @@ -0,0 +1,61 @@ +package com.pestphp.pest.completion + +import com.intellij.openapi.project.guessProjectDir +import com.intellij.util.indexing.DataIndexer +import com.intellij.util.indexing.FileBasedIndex +import com.intellij.util.indexing.FileBasedIndexExtension +import com.intellij.util.indexing.FileContent +import com.intellij.util.indexing.ID +import com.intellij.util.io.DataExternalizer +import com.intellij.util.io.EnumeratorStringDescriptor +import com.intellij.util.io.KeyDescriptor +import com.intellij.util.io.VoidDataExternalizer +import com.jetbrains.php.lang.PhpFileType +import com.pestphp.pest.getAllBeforeThisAssignments + +class ThisFieldsIndex : FileBasedIndexExtension() { + private val emptyMap = HashMap() + + override fun getName(): ID { + return KEY + } + + override fun getIndexer(): DataIndexer { + return DataIndexer { fileContent -> + val path = fileContent.file.path.removePrefix(fileContent.project.guessProjectDir()?.path + ?: return@DataIndexer emptyMap) + + if (!path.startsWith("/tests/")) return@DataIndexer emptyMap + + fileContent.psiFile.getAllBeforeThisAssignments().map { + it.variable?.name!! to null + }.toMap() + } + } + + override fun getKeyDescriptor(): KeyDescriptor { + return EnumeratorStringDescriptor.INSTANCE + } + + override fun getValueExternalizer(): DataExternalizer { + return VoidDataExternalizer.INSTANCE + } + + override fun getInputFilter(): FileBasedIndex.InputFilter { + return FileBasedIndex.InputFilter { file -> + file.fileType === PhpFileType.INSTANCE + } + } + + override fun dependsOnFileContent(): Boolean { + return true + } + + override fun getVersion(): Int { + return 1 + } + + companion object { + val KEY = ID.create("com.pestphp.this_fields_index") + } +} diff --git a/src/test/kotlin/com/pestphp/pest/tests/types/fixtures/thisField/beforeEachCompletion.php b/src/test/kotlin/com/pestphp/pest/tests/types/fixtures/thisField/beforeEachCompletion.php new file mode 100644 index 00000000..b5357237 --- /dev/null +++ b/src/test/kotlin/com/pestphp/pest/tests/types/fixtures/thisField/beforeEachCompletion.php @@ -0,0 +1,9 @@ +foo = 1; +}); + +it('has home', function () { + $this-> +}); From 61c76ca79c86ec503be7d730e941e4782771d211 Mon Sep 17 00:00:00 2001 From: adelf Date: Tue, 8 Sep 2020 22:15:15 +0300 Subject: [PATCH 2/4] $this beforeEach fields completion + #62 static and protected methods completion --- .../InternalMembersCompletionProvider.kt | 41 +++++++++++ .../completion/PestCompletionContributor.kt | 23 ++++++ .../ThisFieldsCompletionContributor.kt | 73 ------------------- .../ThisFieldsCompletionProvider.kt | 47 ++++++++++++ .../pest/completion/ThisFieldsIndex.kt | 61 ---------------- src/main/resources/META-INF/plugin.xml | 3 + .../tests/types/ThisFieldCompletionTest.kt | 15 ++++ .../pestphp/pest/tests/types/ThisTypeTest.kt | 2 +- .../pest/tests/types/fixtures/TestCase.php | 6 ++ 9 files changed, 136 insertions(+), 135 deletions(-) create mode 100644 src/main/kotlin/com/pestphp/pest/completion/InternalMembersCompletionProvider.kt create mode 100644 src/main/kotlin/com/pestphp/pest/completion/PestCompletionContributor.kt delete mode 100644 src/main/kotlin/com/pestphp/pest/completion/ThisFieldsCompletionContributor.kt create mode 100644 src/main/kotlin/com/pestphp/pest/completion/ThisFieldsCompletionProvider.kt delete mode 100644 src/main/kotlin/com/pestphp/pest/completion/ThisFieldsIndex.kt create mode 100644 src/test/kotlin/com/pestphp/pest/tests/types/ThisFieldCompletionTest.kt diff --git a/src/main/kotlin/com/pestphp/pest/completion/InternalMembersCompletionProvider.kt b/src/main/kotlin/com/pestphp/pest/completion/InternalMembersCompletionProvider.kt new file mode 100644 index 00000000..da885971 --- /dev/null +++ b/src/main/kotlin/com/pestphp/pest/completion/InternalMembersCompletionProvider.kt @@ -0,0 +1,41 @@ +package com.pestphp.pest.completion + +import com.intellij.codeInsight.completion.CompletionParameters +import com.intellij.codeInsight.completion.CompletionProvider +import com.intellij.codeInsight.completion.CompletionResultSet +import com.intellij.util.ProcessingContext +import com.jetbrains.php.PhpIndex +import com.jetbrains.php.completion.PhpVariantsUtil +import com.jetbrains.php.lang.psi.elements.FieldReference +import com.jetbrains.php.lang.psi.elements.Variable +import com.pestphp.pest.isAnyPestFunction +import com.pestphp.pest.isThisVariableInPest + +class InternalMembersCompletionProvider: CompletionProvider() { + override fun addCompletions(parameters: CompletionParameters, context: ProcessingContext, result: CompletionResultSet) { + val fieldReference = parameters.position.parent as? FieldReference ?: return + + val variable = fieldReference.classReference as? Variable ?: return + + if (!variable.isThisVariableInPest { it.isAnyPestFunction() }) return + + val phpIndex = PhpIndex.getInstance(fieldReference.project) + val classes = phpIndex.completeType(fieldReference.project, variable.type, null).types.filter { it.startsWith("\\") }.flatMap { + phpIndex.getAnyByFQN(it) + } + + classes.flatMap { phpClass -> + phpClass.methods.filter { it.access.isProtected || (!it.access.isPrivate && it.isStatic) } + }.forEach { + result.addElement(PhpVariantsUtil.getLookupItem(it, null)) + } + + classes.flatMap { phpClass -> + phpClass.fields.filter { it.modifier.isProtected } + }.forEach { + result.addElement(PhpVariantsUtil.getLookupItem(it, null)) + } + + //PhpStaticAsDynamicMethodCallInspection + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/pestphp/pest/completion/PestCompletionContributor.kt b/src/main/kotlin/com/pestphp/pest/completion/PestCompletionContributor.kt new file mode 100644 index 00000000..daaac7e2 --- /dev/null +++ b/src/main/kotlin/com/pestphp/pest/completion/PestCompletionContributor.kt @@ -0,0 +1,23 @@ +package com.pestphp.pest.completion + +import com.intellij.codeInsight.completion.CompletionContributor +import com.intellij.codeInsight.completion.CompletionType +import com.intellij.patterns.PlatformPatterns +import com.jetbrains.php.lang.lexer.PhpTokenTypes +import com.jetbrains.php.lang.psi.elements.FieldReference + +class PestCompletionContributor : CompletionContributor() { + init { + extend( + CompletionType.BASIC, + PlatformPatterns.psiElement().withElementType(PhpTokenTypes.IDENTIFIER).withParent(FieldReference::class.java), + InternalMembersCompletionProvider() + ) + + extend( + CompletionType.BASIC, + PlatformPatterns.psiElement().withElementType(PhpTokenTypes.IDENTIFIER).withParent(FieldReference::class.java), + ThisFieldsCompletionProvider() + ) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/pestphp/pest/completion/ThisFieldsCompletionContributor.kt b/src/main/kotlin/com/pestphp/pest/completion/ThisFieldsCompletionContributor.kt deleted file mode 100644 index 3aa9b3b2..00000000 --- a/src/main/kotlin/com/pestphp/pest/completion/ThisFieldsCompletionContributor.kt +++ /dev/null @@ -1,73 +0,0 @@ -package com.pestphp.pest.completion - -import com.intellij.codeInsight.completion.CompletionContributor -import com.intellij.codeInsight.completion.CompletionParameters -import com.intellij.codeInsight.completion.CompletionProvider -import com.intellij.codeInsight.completion.CompletionResultSet -import com.intellij.codeInsight.completion.CompletionType -import com.intellij.codeInsight.lookup.LookupElementBuilder -import com.intellij.codeInsight.navigation.actions.GotoDeclarationHandler -import com.intellij.openapi.editor.Editor -import com.intellij.patterns.PlatformPatterns -import com.intellij.psi.PsiElement -import com.intellij.psi.util.elementType -import com.intellij.util.ProcessingContext -import com.intellij.util.indexing.FileBasedIndex -import com.jetbrains.php.PhpIcons -import com.jetbrains.php.lang.lexer.PhpTokenTypes -import com.jetbrains.php.lang.psi.elements.FieldReference -import com.jetbrains.php.lang.psi.elements.Variable -import com.jetbrains.php.lang.psi.elements.impl.FunctionReferenceImpl -import com.pestphp.pest.getAllBeforeThisAssignments -import com.pestphp.pest.isPestAfterFunction -import com.pestphp.pest.isPestTestFunction -import com.pestphp.pest.isThisVariableInPest - -class ThisFieldsCompletionContributor : CompletionContributor(), GotoDeclarationHandler { - init { - extend( - CompletionType.BASIC, - PlatformPatterns.psiElement().withElementType(PhpTokenTypes.IDENTIFIER).withParent(FieldReference::class.java), - provider - ) - } - - override fun getGotoDeclarationTargets(sourceElement: PsiElement?, offset: Int, editor: Editor?): Array { - if (sourceElement?.elementType != PhpTokenTypes.IDENTIFIER) return PsiElement.EMPTY_ARRAY - - val fieldReference = sourceElement?.parent as? FieldReference ?: return PsiElement.EMPTY_ARRAY - - if (fieldReference.classReference?.isThisVariableInPest { check(it) } != true) return PsiElement.EMPTY_ARRAY - - return (fieldReference.containingFile ?: return PsiElement.EMPTY_ARRAY).getAllBeforeThisAssignments() - .filter { it.variable?.name == fieldReference.name } - .mapNotNull { it.variable } - .toTypedArray() - } - - companion object { - private val provider = Provider() - - private fun check(it: FunctionReferenceImpl) = it.isPestTestFunction() || it.isPestAfterFunction() - } - - private class Provider : CompletionProvider() { - override fun addCompletions(parameters: CompletionParameters, context: ProcessingContext, result: CompletionResultSet) { - val fieldReference = parameters.originalPosition?.parent as? FieldReference ?: return - - if ((fieldReference.classReference as? Variable)?.name != "this") return - - FileBasedIndex.getInstance().getFileData( - ThisFieldsIndex.KEY, - fieldReference.containingFile.virtualFile, - fieldReference.project - ) - .keys - .forEach { - result.addElement( - LookupElementBuilder.create(it).withIcon(PhpIcons.FIELD) - ) - } - } - } -} \ No newline at end of file diff --git a/src/main/kotlin/com/pestphp/pest/completion/ThisFieldsCompletionProvider.kt b/src/main/kotlin/com/pestphp/pest/completion/ThisFieldsCompletionProvider.kt new file mode 100644 index 00000000..749d9ba1 --- /dev/null +++ b/src/main/kotlin/com/pestphp/pest/completion/ThisFieldsCompletionProvider.kt @@ -0,0 +1,47 @@ +package com.pestphp.pest.completion + +import com.intellij.codeInsight.completion.CompletionParameters +import com.intellij.codeInsight.completion.CompletionProvider +import com.intellij.codeInsight.completion.CompletionResultSet +import com.intellij.codeInsight.lookup.LookupElementBuilder +import com.intellij.codeInsight.navigation.actions.GotoDeclarationHandler +import com.intellij.openapi.editor.Editor +import com.intellij.psi.PsiElement +import com.intellij.psi.util.elementType +import com.intellij.util.ProcessingContext +import com.jetbrains.php.PhpIcons +import com.jetbrains.php.lang.lexer.PhpTokenTypes +import com.jetbrains.php.lang.psi.elements.FieldReference +import com.jetbrains.php.lang.psi.elements.Variable +import com.pestphp.pest.getAllBeforeThisAssignments +import com.pestphp.pest.isAnyPestFunction +import com.pestphp.pest.isThisVariableInPest + +class ThisFieldsCompletionProvider : CompletionProvider(), GotoDeclarationHandler { + override fun addCompletions(parameters: CompletionParameters, context: ProcessingContext, result: CompletionResultSet) { + val fieldReference = parameters.position.parent as? FieldReference ?: return + + val variable = fieldReference.classReference as? Variable ?: return + + if (!variable.isThisVariableInPest { it.isAnyPestFunction() }) return + + return (fieldReference.containingFile ?: return).getAllBeforeThisAssignments() + .mapNotNull { it.variable?.name } + .forEach { + result.addElement(LookupElementBuilder.create(it).withIcon(PhpIcons.FIELD)) + } + } + + override fun getGotoDeclarationTargets(sourceElement: PsiElement?, offset: Int, editor: Editor?): Array { + if (sourceElement?.elementType != PhpTokenTypes.IDENTIFIER) return PsiElement.EMPTY_ARRAY + + val fieldReference = sourceElement?.parent as? FieldReference ?: return PsiElement.EMPTY_ARRAY + + if (fieldReference.classReference?.isThisVariableInPest { it.isAnyPestFunction() } != true) return PsiElement.EMPTY_ARRAY + + return (fieldReference.containingFile ?: return PsiElement.EMPTY_ARRAY).getAllBeforeThisAssignments() + .filter { it.variable?.name == fieldReference.name } + .mapNotNull { it.variable } + .toTypedArray() + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/pestphp/pest/completion/ThisFieldsIndex.kt b/src/main/kotlin/com/pestphp/pest/completion/ThisFieldsIndex.kt deleted file mode 100644 index 862df580..00000000 --- a/src/main/kotlin/com/pestphp/pest/completion/ThisFieldsIndex.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.pestphp.pest.completion - -import com.intellij.openapi.project.guessProjectDir -import com.intellij.util.indexing.DataIndexer -import com.intellij.util.indexing.FileBasedIndex -import com.intellij.util.indexing.FileBasedIndexExtension -import com.intellij.util.indexing.FileContent -import com.intellij.util.indexing.ID -import com.intellij.util.io.DataExternalizer -import com.intellij.util.io.EnumeratorStringDescriptor -import com.intellij.util.io.KeyDescriptor -import com.intellij.util.io.VoidDataExternalizer -import com.jetbrains.php.lang.PhpFileType -import com.pestphp.pest.getAllBeforeThisAssignments - -class ThisFieldsIndex : FileBasedIndexExtension() { - private val emptyMap = HashMap() - - override fun getName(): ID { - return KEY - } - - override fun getIndexer(): DataIndexer { - return DataIndexer { fileContent -> - val path = fileContent.file.path.removePrefix(fileContent.project.guessProjectDir()?.path - ?: return@DataIndexer emptyMap) - - if (!path.startsWith("/tests/")) return@DataIndexer emptyMap - - fileContent.psiFile.getAllBeforeThisAssignments().map { - it.variable?.name!! to null - }.toMap() - } - } - - override fun getKeyDescriptor(): KeyDescriptor { - return EnumeratorStringDescriptor.INSTANCE - } - - override fun getValueExternalizer(): DataExternalizer { - return VoidDataExternalizer.INSTANCE - } - - override fun getInputFilter(): FileBasedIndex.InputFilter { - return FileBasedIndex.InputFilter { file -> - file.fileType === PhpFileType.INSTANCE - } - } - - override fun dependsOnFileContent(): Boolean { - return true - } - - override fun getVersion(): Int { - return 1 - } - - companion object { - val KEY = ID.create("com.pestphp.this_fields_index") - } -} diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index f73e8006..e0d2ddd3 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -33,6 +33,9 @@ displayName="Duplicate test name" implementationClass="com.pestphp.pest.inspections.DuplicateTestNameInspection" /> + + + diff --git a/src/test/kotlin/com/pestphp/pest/tests/types/ThisFieldCompletionTest.kt b/src/test/kotlin/com/pestphp/pest/tests/types/ThisFieldCompletionTest.kt new file mode 100644 index 00000000..d71a48b2 --- /dev/null +++ b/src/test/kotlin/com/pestphp/pest/tests/types/ThisFieldCompletionTest.kt @@ -0,0 +1,15 @@ +package com.pestphp.pest.tests.types + +class ThisFieldCompletionTest : BaseTypeTest() { + override fun setUp() { + super.setUp() + + myFixture.copyDirectoryToProject("thisField", "tests") + } + + fun testFieldCompletions() { + myFixture.configureByFile("tests/beforeEachCompletion.php") + + assertCompletion("foo") + } +} diff --git a/src/test/kotlin/com/pestphp/pest/tests/types/ThisTypeTest.kt b/src/test/kotlin/com/pestphp/pest/tests/types/ThisTypeTest.kt index aa5b62b2..995df17b 100644 --- a/src/test/kotlin/com/pestphp/pest/tests/types/ThisTypeTest.kt +++ b/src/test/kotlin/com/pestphp/pest/tests/types/ThisTypeTest.kt @@ -28,6 +28,6 @@ class ThisTypeTest : BaseTypeTest() { } private fun assertThisCompletion() { - assertCompletion("expectException", "expectExceptionCode") + assertCompletion("expectException", "expectExceptionCode", "someProtectedMethod", "someStaticMethod", "protectedField") } } diff --git a/src/test/kotlin/com/pestphp/pest/tests/types/fixtures/TestCase.php b/src/test/kotlin/com/pestphp/pest/tests/types/fixtures/TestCase.php index 3973412e..5958b222 100644 --- a/src/test/kotlin/com/pestphp/pest/tests/types/fixtures/TestCase.php +++ b/src/test/kotlin/com/pestphp/pest/tests/types/fixtures/TestCase.php @@ -3,6 +3,8 @@ namespace PHPUnit\Framework; abstract class TestCase { + protected $protectedField; + /** * @param string $exception */ @@ -12,4 +14,8 @@ public function expectException($exception) {} * @param int|string $code */ public function expectExceptionCode($code){} + + protected function someProtectedMethod(){} + + public static function someStaticMethod(){} } \ No newline at end of file From 1d156bf27b543fb78e33575ee918acd7fd0d259e Mon Sep 17 00:00:00 2001 From: adelf Date: Tue, 8 Sep 2020 22:21:20 +0300 Subject: [PATCH 3/4] fix detekt issues --- .../InternalMembersCompletionProvider.kt | 20 +++++++++------ .../completion/PestCompletionContributor.kt | 10 +++++--- .../ThisFieldsCompletionProvider.kt | 25 ++++++++++++++----- .../com/pestphp/pest/goto/PestTestFinder.kt | 2 +- 4 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/main/kotlin/com/pestphp/pest/completion/InternalMembersCompletionProvider.kt b/src/main/kotlin/com/pestphp/pest/completion/InternalMembersCompletionProvider.kt index da885971..242ecaff 100644 --- a/src/main/kotlin/com/pestphp/pest/completion/InternalMembersCompletionProvider.kt +++ b/src/main/kotlin/com/pestphp/pest/completion/InternalMembersCompletionProvider.kt @@ -11,8 +11,12 @@ import com.jetbrains.php.lang.psi.elements.Variable import com.pestphp.pest.isAnyPestFunction import com.pestphp.pest.isThisVariableInPest -class InternalMembersCompletionProvider: CompletionProvider() { - override fun addCompletions(parameters: CompletionParameters, context: ProcessingContext, result: CompletionResultSet) { +class InternalMembersCompletionProvider : CompletionProvider() { + override fun addCompletions( + parameters: CompletionParameters, + context: ProcessingContext, + result: CompletionResultSet + ) { val fieldReference = parameters.position.parent as? FieldReference ?: return val variable = fieldReference.classReference as? Variable ?: return @@ -20,9 +24,11 @@ class InternalMembersCompletionProvider: CompletionProvider phpClass.methods.filter { it.access.isProtected || (!it.access.isPrivate && it.isStatic) } @@ -35,7 +41,5 @@ class InternalMembersCompletionProvider: CompletionProvider(), GotoDeclarationHandler { - override fun addCompletions(parameters: CompletionParameters, context: ProcessingContext, result: CompletionResultSet) { + override fun addCompletions( + parameters: CompletionParameters, + context: ProcessingContext, + result: CompletionResultSet + ) { val fieldReference = parameters.position.parent as? FieldReference ?: return val variable = fieldReference.classReference as? Variable ?: return @@ -32,16 +36,25 @@ class ThisFieldsCompletionProvider : CompletionProvider(), } } - override fun getGotoDeclarationTargets(sourceElement: PsiElement?, offset: Int, editor: Editor?): Array { - if (sourceElement?.elementType != PhpTokenTypes.IDENTIFIER) return PsiElement.EMPTY_ARRAY + override fun getGotoDeclarationTargets( + sourceElement: PsiElement?, + offset: Int, + editor: Editor? + ): Array { + if (sourceElement?.elementType != PhpTokenTypes.IDENTIFIER) { + return PsiElement.EMPTY_ARRAY + } - val fieldReference = sourceElement?.parent as? FieldReference ?: return PsiElement.EMPTY_ARRAY + val fieldReference = sourceElement?.parent as? FieldReference + ?: return PsiElement.EMPTY_ARRAY - if (fieldReference.classReference?.isThisVariableInPest { it.isAnyPestFunction() } != true) return PsiElement.EMPTY_ARRAY + if (fieldReference.classReference?.isThisVariableInPest { it.isAnyPestFunction() } != true) { + return PsiElement.EMPTY_ARRAY + } return (fieldReference.containingFile ?: return PsiElement.EMPTY_ARRAY).getAllBeforeThisAssignments() .filter { it.variable?.name == fieldReference.name } .mapNotNull { it.variable } .toTypedArray() } -} \ No newline at end of file +} diff --git a/src/main/kotlin/com/pestphp/pest/goto/PestTestFinder.kt b/src/main/kotlin/com/pestphp/pest/goto/PestTestFinder.kt index 747ed264..0b74fb24 100644 --- a/src/main/kotlin/com/pestphp/pest/goto/PestTestFinder.kt +++ b/src/main/kotlin/com/pestphp/pest/goto/PestTestFinder.kt @@ -43,7 +43,7 @@ class PestTestFinder : TestFinder { GlobalSearchScope.projectScope(element.project) ) } - .map { PsiManager.getInstance(element.project).findFile(it)!! } + .mapNotNull { PsiManager.getInstance(element.project).findFile(it) } .toCollection(ArrayList()) } } From b1ec79a6323044b9f06ed0b3a577a3c19841a015 Mon Sep 17 00:00:00 2001 From: adelf Date: Tue, 8 Sep 2020 22:24:38 +0300 Subject: [PATCH 4/4] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 04bf2e19..81cb2c98 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ - Added support for navigation between tests and test subject ([#53](https://github.com/pestphp/pest-intellij/pull/53)) - Added error reporting to GitHub issues ([#55](https://github.com/pestphp/pest-intellij/pull/55)) - Added inspection for duplicate test names in same file. ([#56](https://github.com/pestphp/pest-intellij/pull/56)) +- Added completions for static and protected $this methods. ([#66](https://github.com/pestphp/pest-intellij/pull/66)) +- Added completions $this fields declared in beforeEach functions. ([#66](https://github.com/pestphp/pest-intellij/pull/66)) ### Changed