mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
suggest primitive types in parameter type position after an annotation
This commit is contained in:
+1
-1
@@ -130,7 +130,7 @@ public class JavaCompletionContributor extends CompletionContributor {
|
||||
}
|
||||
|
||||
if (JavaCompletionData.DECLARATION_START.accepts(position) ||
|
||||
JavaCompletionData.INSIDE_PARAMETER_LIST.accepts(position)) {
|
||||
JavaCompletionData.isInsideParameterList(position)) {
|
||||
return new OrFilter(ElementClassFilter.CLASS, ElementClassFilter.PACKAGE_FILTER);
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,6 @@ import com.intellij.psi.filters.classes.InterfaceFilter;
|
||||
import com.intellij.psi.filters.element.ReferenceOnFilter;
|
||||
import com.intellij.psi.filters.getters.JavaMembersGetter;
|
||||
import com.intellij.psi.filters.position.*;
|
||||
import com.intellij.psi.filters.types.TypeCodeFragmentIsVoidEnabledFilter;
|
||||
import com.intellij.psi.impl.source.jsp.jspJava.JspClassLevelDeclarationStatement;
|
||||
import com.intellij.psi.jsp.JspElementType;
|
||||
import com.intellij.psi.templateLanguages.OuterLanguageElement;
|
||||
@@ -71,12 +70,26 @@ public class JavaCompletionData extends JavaAwareCompletionData {
|
||||
new ParentElementFilter(new ClassFilter(PsiTryStatement.class)))
|
||||
)));
|
||||
|
||||
public static final PsiJavaElementPattern.Capture<PsiElement> INSIDE_PARAMETER_LIST =
|
||||
private static final PsiJavaElementPattern.Capture<PsiElement> INSIDE_PARAMETER_LIST =
|
||||
psiElement().withParent(
|
||||
psiElement(PsiJavaCodeReferenceElement.class).insideStarting(
|
||||
psiElement().withTreeParent(
|
||||
psiElement(PsiParameterList.class).andNot(psiElement(PsiAnnotationParameterList.class)))));
|
||||
|
||||
public static boolean isInsideParameterList(PsiElement position) {
|
||||
PsiElement prev = PsiTreeUtil.prevVisibleLeaf(position);
|
||||
PsiModifierList modifierList = PsiTreeUtil.getParentOfType(prev, PsiModifierList.class);
|
||||
if (modifierList != null) {
|
||||
if (PsiTreeUtil.isAncestor(modifierList, position, false)) {
|
||||
return false;
|
||||
}
|
||||
PsiElement parent = modifierList.getParent();
|
||||
return parent instanceof PsiParameterList || parent instanceof PsiParameter && parent.getParent() instanceof PsiParameterList;
|
||||
}
|
||||
return INSIDE_PARAMETER_LIST.accepts(position);
|
||||
}
|
||||
|
||||
|
||||
private static final AndFilter START_OF_CODE_FRAGMENT = new AndFilter(
|
||||
new ScopeFilter(new AndFilter(
|
||||
new ClassFilter(JavaCodeFragment.class),
|
||||
@@ -218,24 +231,6 @@ public class JavaCompletionData extends JavaAwareCompletionData {
|
||||
}
|
||||
|
||||
protected void initVariantsInFileScope(){
|
||||
// package keyword completion
|
||||
{
|
||||
final CompletionVariant variant = new CompletionVariant(PsiJavaFile.class, new StartElementFilter());
|
||||
variant.addCompletion(PsiKeyword.PACKAGE, TailType.INSERT_SPACE);
|
||||
registerVariant(variant);
|
||||
}
|
||||
|
||||
// import keyword completion
|
||||
{
|
||||
final CompletionVariant variant = new CompletionVariant(PsiJavaFile.class, new OrFilter(
|
||||
new StartElementFilter(),
|
||||
END_OF_BLOCK
|
||||
));
|
||||
variant.addCompletion(PsiKeyword.IMPORT);
|
||||
|
||||
registerVariant(variant);
|
||||
}
|
||||
// other in file scope
|
||||
{
|
||||
final CompletionVariant variant = new CompletionVariant(PsiJavaFile.class, CLASS_START);
|
||||
variant.includeScopeClass(PsiClass.class);
|
||||
@@ -246,21 +241,6 @@ public class JavaCompletionData extends JavaAwareCompletionData {
|
||||
registerVariant(variant);
|
||||
}
|
||||
|
||||
{
|
||||
final CompletionVariant variant = new CompletionVariant(PsiTypeCodeFragment.class, new StartElementFilter());
|
||||
addPrimitiveTypes(variant, TailType.NONE);
|
||||
final CompletionVariant variant1 = new CompletionVariant(PsiTypeCodeFragment.class,
|
||||
new AndFilter(
|
||||
new StartElementFilter(),
|
||||
new TypeCodeFragmentIsVoidEnabledFilter()
|
||||
)
|
||||
);
|
||||
variant1.addCompletion(PsiKeyword.VOID, TailType.NONE);
|
||||
registerVariant(variant);
|
||||
registerVariant(variant1);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -406,10 +386,6 @@ public class JavaCompletionData extends JavaAwareCompletionData {
|
||||
|
||||
}
|
||||
|
||||
private static void addPrimitiveTypes(CompletionVariant variant, TailType tailType){
|
||||
variant.addCompletion(PRIMITIVE_TYPES, tailType);
|
||||
}
|
||||
|
||||
private static TailType getReturnTail(PsiElement position) {
|
||||
PsiElement scope = position;
|
||||
while(true){
|
||||
@@ -516,7 +492,15 @@ public class JavaCompletionData extends JavaAwareCompletionData {
|
||||
result.addElement(createKeyword(position, PsiKeyword.FALSE));
|
||||
}
|
||||
|
||||
if (INSIDE_PARAMETER_LIST.accepts(position) && !psiElement().afterLeaf(PsiKeyword.FINAL).accepts(position) && !AFTER_DOT.accepts(position)) {
|
||||
if (PsiTreeUtil.prevVisibleLeaf(position) == null) {
|
||||
result.addElement(new OverrideableSpace(createKeyword(position, PsiKeyword.PACKAGE), TailType.HUMBLE_SPACE_BEFORE_WORD));
|
||||
result.addElement(new OverrideableSpace(createKeyword(position, PsiKeyword.IMPORT), TailType.HUMBLE_SPACE_BEFORE_WORD));
|
||||
}
|
||||
else if (END_OF_BLOCK.isAcceptable(position, position) && PsiTreeUtil.getParentOfType(position, PsiMember.class) == null) {
|
||||
result.addElement(new OverrideableSpace(createKeyword(position, PsiKeyword.IMPORT), TailType.HUMBLE_SPACE_BEFORE_WORD));
|
||||
}
|
||||
|
||||
if (isInsideParameterList(position) && !psiElement().afterLeaf(PsiKeyword.FINAL).accepts(position) && !AFTER_DOT.accepts(position)) {
|
||||
result.addElement(TailTypeDecorator.withTail(createKeyword(position, PsiKeyword.FINAL), TailType.HUMBLE_SPACE_BEFORE_WORD));
|
||||
}
|
||||
|
||||
@@ -579,7 +563,7 @@ public class JavaCompletionData extends JavaAwareCompletionData {
|
||||
}
|
||||
|
||||
static boolean isAfterTypeDot(PsiElement position) {
|
||||
if (INSIDE_PARAMETER_LIST.accepts(position) || position.getContainingFile() instanceof PsiJavaCodeReferenceCodeFragment) {
|
||||
if (isInsideParameterList(position) || position.getContainingFile() instanceof PsiJavaCodeReferenceCodeFragment) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -592,20 +576,24 @@ public class JavaCompletionData extends JavaAwareCompletionData {
|
||||
.afterLeaf(psiElement().withText("(").withParent(psiElement(PsiParenthesizedExpression.class, PsiTypeCastExpression.class)))
|
||||
.accepts(position);
|
||||
|
||||
boolean typeFragment = position.getContainingFile() instanceof PsiTypeCodeFragment && PsiTreeUtil.prevVisibleLeaf(position) == null;
|
||||
boolean declaration = DECLARATION_START.accepts(position);
|
||||
if (START_FOR.accepts(position) ||
|
||||
INSIDE_PARAMETER_LIST.accepts(position) && !AFTER_DOT.accepts(position) ||
|
||||
isInsideParameterList(position) && !AFTER_DOT.accepts(position) ||
|
||||
VARIABLE_AFTER_FINAL.accepts(position) ||
|
||||
inCast ||
|
||||
declaration ||
|
||||
typeFragment ||
|
||||
isStatementPosition(position)) {
|
||||
for (String primitiveType : PRIMITIVE_TYPES) {
|
||||
LookupElement keyword = createKeyword(position, primitiveType);
|
||||
result.addElement(inCast ? keyword : new OverrideableSpace(keyword, TailType.HUMBLE_SPACE_BEFORE_WORD));
|
||||
result.addElement(inCast || typeFragment ? keyword : new OverrideableSpace(keyword, TailType.HUMBLE_SPACE_BEFORE_WORD));
|
||||
}
|
||||
}
|
||||
if (declaration) {
|
||||
result.addElement(new OverrideableSpace(createKeyword(position, PsiKeyword.VOID), TailType.HUMBLE_SPACE_BEFORE_WORD));
|
||||
} else if (typeFragment && ((PsiTypeCodeFragment)position.getContainingFile()).isVoidValid()) {
|
||||
result.addElement(createKeyword(position, PsiKeyword.VOID));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -128,7 +128,7 @@ public abstract class JavaCodeContextType extends TemplateContextType {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (JavaCompletionData.INSIDE_PARAMETER_LIST.accepts(element)) {
|
||||
if (JavaCompletionData.isInsideParameterList(element)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -159,7 +159,7 @@ public abstract class JavaCodeContextType extends TemplateContextType {
|
||||
return false;
|
||||
}
|
||||
|
||||
return JavaCompletionData.CLASS_START.isAcceptable(element, element) || JavaCompletionData.INSIDE_PARAMETER_LIST.accepts(element);
|
||||
return JavaCompletionData.CLASS_START.isAcceptable(element, element) || JavaCompletionData.isInsideParameterList(element);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
/*
|
||||
* Copyright 2000-2009 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.intellij.psi.filters.position;
|
||||
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.filters.ElementFilter;
|
||||
import com.intellij.psi.filters.FilterUtil;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: ik
|
||||
* Date: 30.01.2003
|
||||
* Time: 13:48:00
|
||||
* To change this template use Options | File Templates.
|
||||
*/
|
||||
public class PreviousElementFilter extends PositionElementFilter{
|
||||
public PreviousElementFilter(){}
|
||||
|
||||
public PreviousElementFilter(ElementFilter filter){
|
||||
setFilter(filter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAcceptable(Object element, PsiElement context){
|
||||
if (!(element instanceof PsiElement)) return false;
|
||||
if((element = FilterUtil.getPreviousElement((PsiElement) element, true)) != null){
|
||||
return getFilter().isAcceptable(element, context);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public String toString(){
|
||||
return "previous(" +getFilter()+")";
|
||||
}
|
||||
}
|
||||
-38
@@ -1,38 +0,0 @@
|
||||
/*
|
||||
* Copyright 2000-2009 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.intellij.psi.filters.types;
|
||||
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiTypeCodeFragment;
|
||||
import com.intellij.psi.filters.ElementFilter;
|
||||
import com.intellij.util.ReflectionCache;
|
||||
|
||||
/**
|
||||
* @author dsl
|
||||
*/
|
||||
public class TypeCodeFragmentIsVoidEnabledFilter implements ElementFilter {
|
||||
@Override
|
||||
public boolean isAcceptable(Object element, PsiElement context) {
|
||||
return context instanceof PsiTypeCodeFragment &&
|
||||
((PsiTypeCodeFragment)context).isVoidValid();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isClassAcceptable(Class hintClass) {
|
||||
return ReflectionCache.isAssignable(hintClass, PsiTypeCodeFragment.class);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user