mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-10-01 09:03:31 +07:00
PY-27180: Unify API for method contribution, provide "clean_" method for forms
This commit is contained in:
+40
-15
@@ -20,25 +20,26 @@ import com.intellij.codeInsight.completion.*;
|
||||
import com.intellij.codeInsight.lookup.LookupElement;
|
||||
import com.intellij.codeInsight.lookup.LookupElementBuilder;
|
||||
import com.intellij.codeInsight.lookup.TailTypeDecorator;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.util.ObjectUtils;
|
||||
import com.intellij.util.ProcessingContext;
|
||||
import com.jetbrains.python.PyNames;
|
||||
import com.jetbrains.python.PythonLanguage;
|
||||
import com.jetbrains.python.psi.LanguageLevel;
|
||||
import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
|
||||
import com.jetbrains.python.psi.PyClass;
|
||||
import com.jetbrains.python.psi.PyFunction;
|
||||
import com.jetbrains.python.psi.types.TypeEvalContext;
|
||||
import icons.PythonIcons;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import static com.intellij.patterns.PlatformPatterns.psiElement;
|
||||
|
||||
/**
|
||||
* Completes predefined method names like __str__
|
||||
* Contributes method names to class
|
||||
* User: dcheryasov
|
||||
* @author Ilya.Kazakevich
|
||||
* Date: Dec 3, 2009 10:06:12 AM
|
||||
*/
|
||||
public class PySpecialMethodNamesCompletionContributor extends CompletionContributor {
|
||||
public abstract class PyMethodNamesCompletionContributor extends CompletionContributor {
|
||||
@Override
|
||||
public AutoCompletionDecision handleAutoCompletionPossibility(@NotNull AutoCompletionContext context) {
|
||||
// auto-insert the obvious only case; else show other cases.
|
||||
@@ -49,26 +50,50 @@ public class PySpecialMethodNamesCompletionContributor extends CompletionContrib
|
||||
return AutoCompletionDecision.SHOW_LOOKUP;
|
||||
}
|
||||
|
||||
public PySpecialMethodNamesCompletionContributor() {
|
||||
/**
|
||||
* @return method_name, (arguments)
|
||||
*/
|
||||
@NotNull
|
||||
protected abstract Iterable<Pair<String, String>> getCompletions(@NotNull final PyClass aClass,
|
||||
@NotNull final TypeEvalContext context);
|
||||
|
||||
protected PyMethodNamesCompletionContributor() {
|
||||
extend(
|
||||
CompletionType.BASIC,
|
||||
psiElement()
|
||||
.withLanguage(PythonLanguage.getInstance())
|
||||
.and(psiElement().inside(psiElement(PyFunction.class).inside(psiElement(PyClass.class))))
|
||||
.and(psiElement().afterLeaf("def"))
|
||||
,
|
||||
,
|
||||
new CompletionProvider<CompletionParameters>() {
|
||||
@Override
|
||||
protected void addCompletions(
|
||||
@NotNull final CompletionParameters parameters, final ProcessingContext context, @NotNull final CompletionResultSet result
|
||||
) {
|
||||
LanguageLevel languageLevel = LanguageLevel.forElement(parameters.getOriginalFile());
|
||||
for (Map.Entry<String, PyNames.BuiltinDescription> entry: PyNames.getBuiltinMethods(languageLevel).entrySet()) {
|
||||
LookupElementBuilder item = LookupElementBuilder
|
||||
.create(entry.getKey() + entry.getValue().getSignature())
|
||||
.bold()
|
||||
final PyFunction method =
|
||||
ObjectUtils.tryCast(ScopeUtil.getScopeOwner(parameters.getPosition()), PyFunction.class);
|
||||
if (method == null) {
|
||||
return;
|
||||
}
|
||||
final PyClass pyClass = method.getContainingClass();
|
||||
if (pyClass == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
final TypeEvalContext typeEvalContext =
|
||||
TypeEvalContext.codeCompletion(pyClass.getProject(), parameters.getOriginalFile());
|
||||
|
||||
|
||||
for (final Pair<String, String> signature : getCompletions(pyClass, typeEvalContext)) {
|
||||
final String name = signature.first;
|
||||
if (pyClass.findMethodByName(name, false, typeEvalContext) != null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
final String parentheses = signature.second;
|
||||
final LookupElementBuilder item = LookupElementBuilder.create(name + parentheses)
|
||||
.withTypeText("predefined")
|
||||
.withIcon(PythonIcons.Python.Nodes.Cyan_dot)
|
||||
;
|
||||
.withIcon(PythonIcons.Python.Nodes.Cyan_dot);
|
||||
result.addElement(TailTypeDecorator.withTail(item, TailType.CASE_COLON));
|
||||
}
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package com.jetbrains.python.codeInsight.completion
|
||||
|
||||
import com.intellij.openapi.util.Pair
|
||||
import com.jetbrains.python.PyNames
|
||||
import com.jetbrains.python.psi.LanguageLevel
|
||||
import com.jetbrains.python.psi.PyClass
|
||||
import com.jetbrains.python.psi.types.TypeEvalContext
|
||||
|
||||
class PySpecialMethodNamesCompletionContributor : PyMethodNamesCompletionContributor() {
|
||||
override fun getCompletions(aClass: PyClass, context: TypeEvalContext) =
|
||||
PyNames.getBuiltinMethods(LanguageLevel.forElement(aClass)).map { Pair(it.key, it.value.signature) }
|
||||
}
|
||||
Reference in New Issue
Block a user