Commit c34c534d authored by Ilya.Kazakevich's avatar Ilya.Kazakevich
Browse files

PY-27180: Unify API for method contribution, provide "clean_" method for forms

parent e7f4e292
Showing with 53 additions and 15 deletions
+53 -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));
}
}
......
// 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) }
}
\ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment